Birim test ve kapsülleme

6 Cevap php

Ben birim test içine almaya çalışıyorum, ama beni rahatsız eden bir şey var.

Ben birim test istediğiniz bir php sınıfı var. Bazı parametreler alır ve ardından HTML tükürür. Sorun ana işlevi bazı değerleri ve koşullarını hesaplıyor ve bu ben test etmek istiyor. Normalde, kimse bu yöntem hakkında bilmek gerekiyor çünkü Ama, özel bir yöntemle bu koyduk. Ben yöntemin sonucunu test hiçbir anlamı var çünkü Ama birimine mümkün değilim bu şekilde sınıfını test.

Ben konu hakkında this makale bulduk. Makalenin sonuç özel yöntemler test için yansıma kullanıyor.

Bu alana nasıl karşı durmak mı?

6 Cevap

Sen kendi sınıfında mantığı vardır ve o birim test bu sınıf, böylece mantık test etmek için html aracılığıyla ulaşmak zorunda değilsiniz gerekir.

Kural olarak:

Sen özel yöntemler test asla. Özel yöntemler kamu yöntemlerinin testleri geçmek yapmak için vardır.

Eğer genel yöntemleri bozmadan özel yöntemleri silebilirsiniz, size özel yöntemleri gerekmez ve bunları silebilirsiniz.

Eğer genel yöntemleri bozmadan özel yöntemleri silemezsiniz, o özel yöntemleri denenmektedir.

Eğer TDD uygulama izlerseniz kod her satırı ünite testleri geçmesi için yazılır, çünkü bu durum içine almak zor olurdu. Sizin sınıf içinde herhangi bir "serseri" kod olmalıdır.

Ben Tormod katılıyorum; Özel yöntemler test olmamalıdır. Sunum mantığı ayırmak genel olarak iyi bir fikir olduğunu ve sunum ayrı mantığını test için izin verecek. Ayrıca, mantık testleri yazma mantık ve sunum düzgün ayrılmış değildir ince durumlarda alıcı gerçekten iyi bir yoldur.

(Özel yöntemler test için yansıma kullanarak benim için gerçekten kötü bir fikir gibi geliyor.)

Birim test yürütme doğruluğu olasılığını geliştirmektedir.

Encapsulation yüksek değişim yayılımı olasılık ile potansiyel bağımlılıkları sayısını minimize ilgili.

Birim test çalışma hakkında; kapsülleme kaynak kodu hakkında.

Onlar hemen dik konum: ne diğer etkilemelidir. Sadece test etmek için özel bir yöntemi kamu yapma iyi bir fikir değil: o gereksiz yere kapsüllemeyi aşağılayıcı birim test bulunuyor.

Bir test dizine tüm kaynak kodu kopyalayın ve daha sonra, değiştirici herhangi bir ve tüm örneklerini kaldırın "özel." Sonra bu, deprivatised dizine yolunda testleri yazmak. Bu kapsülleme kaygılardan birim test decouples.

Örneğin aşağıdaki gibi bir komut ile çalışan bu kopyalama, deprivatising ve birim test otomatikleştirmek.

Selamlar,

Ed.

!/bin/bash

rm-rf kodu kopya

kod kopyasını oluşturma yankı ...

mkdir kodu kopya

cp-r .. / www kodu kopya /

find code-copy -name "*php" -follow i için; do

sed -i 's/private/public/g' $i

tamam

php run_tests.php

Değerleri ve koşullarını hesaplayarak iş mantığıdır. business logic is much more stable görsel temsilden çok. Sen iyi tanımlanmış bir arayüz karşı test etmelisiniz. Bu irade güvenli size GUI ve GUI değişiklikleri ile kodunuzu sınamak gerekirse olacağını sizin testleri değiştirir. (Siz de diğer müşteriler eklemek mümkün olacaktır.)

Eğer render test etmek istiyorsanız (ve olmalıdır) ayrı ayrı bunu.

İşte nice article neden entegrasyon test çalışmaz bulunuyor. (Sizin testi gerçekten bir birim test değildir. Bu uygulamanın iki yönü sınar.)

Bu kurulum ile test etmek için özel yöntemler olmayacaktır.

Özel yöntemler test etmek olağan çözüm yeni bir sınıfa onları ayıklamak ve temsilci olduğunu. Bu Tormod önerdi budur ama bu sizin için bir anlam ifade etmediğini yorumladı.

Ayrıca neler yapabileceğimizi, yöntem public yapmak ancak gizlilik işaretlemek için adlandırma çeşit röle için: Örneğin privateGetNumberOfPages(), ya da _getNumberOfPages(). Bu yöntemi çağırmak için kimse engel olmaz, ama kimse o özel olduğunu bilmiyordum söyleyebiliriz: Bu moral encapsulation olacaktır.

Eğer birim testi, ancak belgedeki yöntemi çağırabilirsiniz bu şekilde (zorunlu değil) bir özel bir yöntemdir. Bu ancak tüm, bazı takımlarda iyi çalışır.

Bir diğer olasılık, iyi bir tasarım-bilge de olsa, yöntem korumalı yapmak için ve deney yöntemini çağırabilirsiniz ve kapsülleme uygulanır böylece dizge sınıf test sınıfından devralmasını sahip olmaktır. Bu PHP mümkün olduğundan emin değilim.

Ben özel bir yöntemi test etmek istiyorsanız, o zaman yeni bir sınıf hareket ve halk olma gerektirecek kadar karmaşık olmak biter bulabilirsiniz. Ben genellikle bu adımları izleyin:, yöntem kamuoyuna iyice test, yeni bir sınıf yeni genel bir yöntem dışarı itmek için bu testlerde oluşturur çoğaltılması, refactor fark.