2015-07-23 16 views
6

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.

+1

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

+1

@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. –

+1

@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

cevap

3

Phpunit'te, Kapsanan Yöntemleri doc'da belirtilen özel açıklamalarla belirtebilirsiniz.

Böyle bir şey yapabilirsiniz:

class ApiControllerTest extends WebTestCase { 

     /** 
     * @covers ApiController::getCodesAction 
     * @covers ApiController::_stringToArray 
     */ 
     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()); 
     } 

    } 

umut

+0

Serin! Bir test fonksiyonuna birden fazla @covers notu yerleştirebileceğimin farkında değildim. Kamu görevlerini eşleştirmek zorunda olduklarını düşündüm! Onu kontrol ettim ve ayrıca özel bir fonksiyonda bir şubenin tamamen gereksiz olduğunu fark ettim, bu yüzden zaten ödüyor! – Fx32

+0

Merhaba @Feroxium hoş geldiniz! – Matteo

+4

Serin!?! Güzel!?!?!?! Eğer bu doğru çözümse, şüphesiz hepiniz PHP'den yeni işler mi arıyorsunuz? Bu çözümün iyi bir fikir olduğunu düşündüğüne inanamıyorum. Yöntemi yeniden adlandırmak için kodu yeniden düzenlerseniz ne olur? şimdi yorumlardaki ek açıklamaları değiştirmek zorundayım? Kendimi vurmayı tercih ederim. –