2013-03-29 8 views
7

Chcę użyć PHPUnit do sprawdzenia, czy metody są wywoływane w odpowiedniej kolejności.PHPUnit: jak sprawdzić, czy metody są wywoływane w nieprawidłowej kolejności?

Moja pierwsza próba, użycie ->at() na fałszywym obiekcie, nie zadziałała. Na przykład, oczekuje się, że po niepowodzenie, ale to nie robi:

public function test_at_constraint() 
    { 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 
    $x->expects($this->at(0))->method('first'); 
    $x->expects($this->at(1))->method('second'); 

    $x->second(); 
    $x->first(); 
    }  

Jedynym sposobem mogę myśleć o tej wymuszonej awarii jeśli rzeczy były nazywane w niewłaściwej kolejności było coś takiego:

public function test_at_constraint_with_exception() 
    { 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 

    $x->expects($this->at(0))->method('first'); 
    $x->expects($this->at(1))->method('first') 
     ->will($this->throwException(new Exception("called at wrong index"))); 

    $x->expects($this->at(1))->method('second'); 
    $x->expects($this->at(0))->method('second') 
     ->will($this->throwException(new Exception("called at wrong index"))); 

    $x->second(); 
    $x->first(); 
    } 

Czy istnieje bardziej elegancki sposób na zrobienie tego? Dzięki!

+0

Spójrz http://api.drupal.org/api/drupal/core%21vendor%21phpunit%21phpunit-mock-objects%21PHPUnit%21Framework%21MockObject%21Matcher%21InvokedAtIndex. php/function/PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex% 3A% 3Averify/8 – jcbwlkr

+0

Myślę, że to pomoże, ale nie jestem pewien. – jcbwlkr

+0

Ta strona wydaje się wskazywać, że '-> at()' nie spowoduje awarii, jeśli jej metoda zostanie wywołana przy innym indeksie, który mój pierwszy przypadek testowy już udowodnił. Czy było coś, co miałbyś na myśli z tej strony, która byłaby przydatna? – des4maisons

Odpowiedz

7

Aby spełnić oczekiwania, potrzebujesz jednego z InvocationMocker. Na przykład to powinno działać:

public function test_at_constraint() 
{ 
    $x = $this->getMock('FirstSecond', array('first', 'second')); 
    $x->expects($this->at(0))->method('first')->with(); 
    $x->expects($this->at(1))->method('second')->with(); 

    $x->second(); 
    $x->first(); 
} 
+0

Oprócz tego, że kończy się niepowodzeniem z "Mocked method does not exist" w mojej wersji phpunit, działa to! NIESAMOWITE! – des4maisons

Powiązane problemy