Yansıma veya diğer geçici çözümler kullanarak PHPUnit ile özel/korumalı yöntemleri sınamanın mümkün olduğunu biliyorum.Korumalı/özel yöntemleri PHPUnit ile sınamadığında kod kapsamı
Ancak çoğu kaynak, bir sınıfın içindeki özel yöntemlere yönelik sınamalar yazmak için en iyi uygulama olan olduğunu söylüyor. Sınıfı "kara kutu" gibi test etmelisiniz - sadece iç mekaniği göz ardı ederek çıktıları girdi ile karşılaştırarak beklenen davranışları test ediyorsunuz. Sınıflar için yazma testleri, kod kapsamı yetersizliğini göstererek, sizi kullanılmayan özel yöntemlere de bildirmelidir.
Sınıfımı test ettiğimde ve bir HTML raporu oluşturduğumda, adlandırılan satırlar kesinlikle yürütüldüğünden/kapatılsa bile, testlerin kapsamına girmeyen özel yöntemleri gösterir. Özel yöntemlerin uygulandığını biliyorum çünkü sınıfımdaki iddialar olmasalardı.
PHPUnit'de bu beklenen davranış mı? Özel yöntemleri yalnızca dolaylı olarak test ederken,% 100 kapsam için çabalayabilir miyim? (Symfony2'deki RestBundle kullanarak)
Bazı basitleştirilmiş bir örnek kod:
class ApiController extends FOSRestController {
/*
* @REST\View()
* @REST\Get("/api/{codes}")
*/
public function getCodesAction($codes) {
$view = new View();
$view->setHeader('Access-Control-Allow-Origin', '*');
$view->setData(array('type' => 'codes','data' => $this->_stringToArray($codes)));
$view->setFormat('json')->setHeader('Content-Type', 'application/json');
return $this->handleView($view);
}
private function _stringToArray($string){
return explode('+',$string);
}
kamu fonksiyonu özel fonksiyon dolaylı kaplıdır, "örtülü" ancak rapor PHPUnit kırmızı renkli gösterir olarak gösterir.
Testi:
class ApiControllerTest extends WebTestCase {
public function test_getCodesAction(){
$client = static::createClient();
$client->request('GET', '/api/1+2+3');
$this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
}
}
Bu tabii aptal bir örnektir, sadece yanı kamu görevlerini tam orada) (patlayabilir içerebilir; Fakat kontrolörler, daha karmaşık ve tekrar kullanılabilen, daha karmaşık yollarla veriyi dönüştüren (ama yine de yan etki içermeyen) özel işlevleri içeren testler yazıyor.
Test özel yöntemler bir sorun değildir bu yardımı kendiliğinden - Böyle testler yapıyor kötü uygulama değildir. İlk olarak zararlı olduğu düşünülen özel yöntemler kullanıyor çünkü test etmek zor. – Narf
@narf, ben buna katılmıyorum. özel yöntemleri test etmek kırılgan testler için yapar ve tek seçenek düşünerek yansımaya başvurmak olduğunu düşünüyorsanız kötü kod kokusu olarak düşünürdüm. Özel yöntemler zararlı değildir, kodu bir sınıf içinde organize etmenin iyi bir yoludur. –
@SamHolder Gevrek, hiçbir şeyden daha iyidir ... Kötü bir uygulama için bir sınava sahip olmanın hiçbir mantığı yoktur ve beni bu konuda ikna edemezsiniz. :) Neyse, ne, nasıl ve ne dereceye kadar test etmek büyük ölçüde fikir temelli bir konudur, bu yüzden size katılmayı kabul etmemeyi tercih ederim. :) – Narf