2009-08-12 14 views
9

Aradım ama aradığım şeyi tam olarak bulamıyorum ve bu konuda çok fazla yardım bulamıyorum. Ben ünite testine oldukça yeniyim, bu yüzden doğru yolda olduğumdan emin değilim. Her neyse, soru üzerine.PHP biriminde sahte Nesneler oluşturma

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

Şimdi, açıkça ben aynı şeyi her zaman dönmek için AnotherClass::returnRandomElement($array_of_stuff); istiyorum: Bir sınıf var. Benim sorum, birim testimde bu nesneyi nasıl ele alabilirim?

Test dosyasının en üstüne AnotherClass eklemeyi denedim, ancak AnotherClass'u test etmek istediğimde "Sınıfı yeniden tanımlayamıyor" hatası alıyorum.

Sanırım fabrika sınıflarını anlıyorum, ancak bunu bu örnekte nasıl uygulayacağımı bilmiyorum. Test verilerini içeren tamamen ayrı bir AnotherClass sınıfı yazmam gerekecek ve daha sonra bunu gerçek bir AnotherClass yerine yüklemek için Factory sınıfını kullanmalı mıyım? Ya da Fabrika modelini sadece kırmızı bir ringa balığı kullanıyor. Kurulum() fonksiyonunda

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

, ancak bu koçanları dikkate alınmaz ve bunu yapıyorum yanlış bir şey, ya bir yol Ben giriyorum olmadığını çalışamaz:

Bu çalıştı AnotherClass yöntemleri.

Yardım! Bu beni deli ediyor.

cevap

6

Birim Testleri ile, statik veri içeren 'test' sınıfları oluşturmak ve bunları test ettiğiniz sınıfa aktarmak istiyorsunuz. Bu, değişkenleri testten kaldırır. Statik Sınıfları kullanmakta olduğunuz için

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

, programdan AnotherClass kaldırmak ve sonra sadece test verilerini döndürür işlevleri içerecek şekilde yeniden oluşturmanız gerekir. Yine de, aslında, programdan dersleri çıkarmak istemezsiniz, bu yüzden yukarıdaki örnekte olduğu gibi sınıfları da geçersiniz.

+0

Parlak, yanıt için teşekkürler. Bir soru olsa da; Bu yüzden benim için tüm örnekleri oluşturan bir Factory sınıfım var. Bu, üretime giren sınıftır. Sahte nesne nesnelerini bu sınıfa ekledim mi yoksa ana fabrika sınıfını üretim olarak mı bırakıyorum, daha sonra da isimler için yeni bir fabrika sınıfı mı ekledim? – Mike

+0

Bu size göre. Test için yeni bir fabrika sınıfı yapabilir veya test ettikten sonra Factory sınıfınızı temizlediğinizden emin olabilirsiniz. –