2009-08-12 11 views
9

Szukałem, ale nie mogę znaleźć dość co szukam i instrukcja nie jest zbyt pomocne w tym względzie. Jestem całkiem nowy w testowaniu jednostkowym, więc nie jestem pewien, czy jestem na dobrej drodze. W każdym razie, na pytanie. Mam klasy:Tworzenie atrapa obiektu w jednostce PHP

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

Teraz wyraźnie chcę AnotherClass::returnRandomElement($array_of_stuff); powrót to samo za każdym razem. W moim teście jednostkowym mam pytanie, jak mam to zrobić w makiecie?

Próbowałem dodanie AnotherClass do początku pliku testowego, ale gdy chcę przetestować AnotherClass otrzymuję „nie można redeclare klasę” błąd.

Chyba rozumiem klas fabrycznych, ale nie jestem pewien, w jaki sposób mogę ubiegać się, że w tym przypadku. Czy musiałbym napisać całkowicie oddzielną klasę AnotherClass, która zawierałaby dane testowe, a następnie użyć klasy Factory, aby załadować ją zamiast prawdziwej kolejki? Lub używa wzoru Factory tylko czerwonego śledzia.

Próbowałem to:

$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())); 

w funkcji setup(), ale te odcinki są ignorowane i nie mogę pracować, czy to coś robię źle, czy droga mam dostępu metody AnotherClass.

Pomoc! To doprowadza mnie do szału.

Odpowiedz

6

z jednostką Testy chcesz utworzyć klas „testowe”, które zawierają dane statyczne, a następnie przekazać te do swojej badanej klasie. To usuwa zmienne z testowania.

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; 
    } 
} 

Ponieważ używasz statycznych klas, trzeba by usunąć AnotherClass z programu, a następnie odtworzyć go tak, że zawiera tylko funkcje, które zwracają dane testowe. Zwykle jednak, nie chcesz faktycznie usuwać klas z programu, dlatego też przekazujesz klasy w podobny sposób jak w powyższym przykładzie.

+0

Brilliant, dzięki za odpowiedzi. Jedno pytanie jednak; więc mam swoją klasę Factory, która tworzy dla mnie wszystkie instancje. To jest klasa, która wchodzi do produkcji. Czy dodaję obiekty symulowane do tej klasy, czy po prostu opuszczam główną klasę fabryczną jako produkcję, a następnie dodaję nową klasę fabryczną do unittests? – Mike

+0

Thats realyl do Ciebie. Możesz wykonać nową klasę fabryczną do testowania lub możesz upewnić się, że wyczyściłeś swoją klasę Factory po przetestowaniu go. –