2013-06-04 14 views
5

jestem testowania kodu PHP z PHPUnit i mam problem:Jak mock nowy obiekt w metodzie - phpunit

jestem testowania Klasa:

class ClassName 
{ 
    public function MethodName() 
    { 
    // something 

    $objectName = new Object(); 
    $variableName = $objectName->execute(); 

    // something 
    } 
} 

chcę tworzyć makiety Object. Nie chcę wywoływać prawdziwej metody execute(). Nie wiem jak to zrobić z phpunitem. Znam wstrzyknięcie zależne, ale IMHO ten przypadek nie jest rozwiązany z zastrzykiem zależności.

Dziękuję za odpowiedzi. Przepraszam za mój angielski.

Odpowiedz

5

W rzeczywistości, ten przypadek można rozwiązać za pomocą zastrzyku przyzębia. Powiedzmy, że nie tworzysz instancji wewnątrz obiektu MethodName, ale wstrzykujesz go. Niezależnie od tego, czy używa się contructor, setter, czy metody, nie ma to większego znaczenia dla zasady.

class ClassName 
{ 
    public function MethodName(Object $objectName) 
    { 
     // something 

     $variableName = $objectName->execute(); 

     // something 
    } 
} 

Bo teraz nie instaniate obiektu wewnątrz metody, którą chcesz przetestować, można przekazać mu makiety gdy chcesz go przetestować.

public function testMethodName(){ 
    $mock = $this->getMockBuilder('Object')->getMock(); 

    $className = new ClassName; 

    $result = $className->MethodName($mock); 

    $this->assertTrue($result); 
} 

Nie uruchomiłem tego testu, ale myślę, że ilustruje on punkt wtrysku depency dla testowalności.

+0

Thans! Muszę wymyślić mój kod. – lukas888

+0

Sam nie jestem ekspertem. Wydaje mi się, że pisanie testów sprawia, że ​​sam kod jest czystszy, ponieważ myślisz lepiej o jego strukturze. http://youtu.be/RlfLCWKxHJ0 i http://youtu.be/-FRm3VPhseI są dobrymi ogólnymi wykładami, a http://www.slideshare.net/fabpot/dependency-injection-with-php-53 dla deputowanych Zastrzyk argument od twórcy Pimple i innych wielkich projektów ... – qrazi

+0

Myślę, że ta strategia nie zawsze jest odpowiednia. Na przykład, jeśli obiekt, który musi zostać utworzony w testowanej metodzie, jest podobny do \ DateTime(). Lub obiekt zdarzenia, który zostanie przekazany do dyspozytora zdarzeń. – Brian

Powiązane problemy