PHPunit: как высмеивать метод с параметром AND возвращаемое значение

Используя PHPUnit, мне интересно, можем ли мы издеваться над объектом, чтобы проверить, вызван ли метод с ожидаемым параметром, и возвращаемое значение?

В документе есть примеры с параметром передачи или возвращаемым значением, но не оба...

Я попытался использовать это:

// 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));

Мое утверждение терпит неудачу, потому что Hoard :: removeItemFromUser() должен вернуть возвращаемое значение User :: removeItem(), которое является истинным.

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

Также не удается выполнить следующее сообщение: " Счетчик параметров для вызова User :: removeItem (Mock_Item_767aa2db Object (...)) слишком мал ".

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

Также не удается выполнить следующее сообщение: " PHPUnit_Framework_Exception: сопоставление параметров уже определено, не может переопределить "

Что я должен сделать, чтобы проверить этот метод правильно.

Ответ 1

Вы должны использовать will вместо with для returnValue и друзей.

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