2012-03-02 22 views
11

Używając PHPUnit, zastanawiam się, czy możemy wyśmiać obiekt do przetestowania, czy metoda jest wywoływana z oczekiwanym parametrem, i zwracaną wartością?PHPunit: Jak wyśmiać metodę, która ma parametr ORAZ zwróconą wartość

W doc istnieją przykłady z przechodzącej parametru lub zwracanej wartości, ale nie zarówno ...

Próbowałem za pomocą tego:

 
// My object to test 
$hoard = new Hoard(); 
// Mock objects used as parameters 
$item = $this->getMock('Item'); 
$user = $this->getMock('User', array('removeItem')); 
... 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

Moje twierdzenie nie bo skarb :: removeItemFromUser() powinien zwracać zwróconą wartość User :: removeItem(), która jest prawdziwa.

 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item), $this->returnValue(true)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

również nie z następującym komunikatem: "liczyć parametrów dla wywołania użytkownik :: removeItem (Mock_Item_767aa2db Object (...)) jest zbyt niska."

 
$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($this->equalTo($item)) 
    ->with($this->returnValue(true)); 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 

nie powiedzie się również z następujący komunikat: "PHPUnit_Framework_Exception: Parameter matcher jest już zdefiniowany, nie można ponownie zdefiniować"

Co należy zrobić, aby poprawnie przetestować tę metodę.

Odpowiedz

18

Musisz użyć will zamiast with dla returnValue i przyjaciół.

$user->expects($this->once()) 
    ->method('removeItem') 
    ->with($item) // equalTo() is the default; save some keystrokes 
    ->will($this->returnValue(true)); // <-- will instead of with 
$this->assertTrue($hoard->removeItemFromUser($item, $user)); 
Powiązane problemy