Мок PHPUnit с несколькими вызовами expect ()

Я удивляюсь, используя PHPUnit, как можно ожидать множественных ожиданий от одной и той же заглушки / макета.

Например, я хочу проверить, что у макета вызывается метод display() и возвращается NULL. Я также хочу проверить, что метод process() будет вызываться.

На самом деле мой тест называется testProcessIsCalledIfDisplayReturnNull().

Поэтому мне нужно настроить 2 ожидания для одного и того же фиктивного объекта, и руководство на самом деле в этом не помогает :(


person FMaz008    schedule 29.04.2011    source источник


Ответы (2)


Если вы знаете, что этот метод вызывается один раз, используйте $ this-> once () в expects (), в противном случае используйте $ this-> any ()

$mock = $this->getMock('nameOfTheClass', array('firstMethod','secondMethod','thirdMethod'));
$mock->expects($this->once())
     ->method('firstMethod')
     ->will($this->returnValue('value'));
$mock->expects($this->once())
     ->method('secondMethod')
     ->will($this->returnValue('value'));
$mock->expects($this->once())
     ->method('thirdMethod')
     ->will($this->returnValue('value'));
person Dmitriy Koval    schedule 29.04.2011
comment
Насколько я понимаю, метод once () следует использовать только тогда, когда считается важным, чтобы метод вызывался ровно один раз - когда код, который вызывал метод более или менее одного раза, следует считать сломанным. Если текущая реализация вызывает его один раз, но в будущем было бы неплохо изменить его на ноль или более, тогда используйте any (). Это упрощает внесение изменений в код в будущем. - person bdsl; 02.06.2017

Я пробовал это, и, похоже, это работает, пока порядок вызовов остается хорошим:

$mock = $this->getMock('mockWorker', array('display', 'process'));
$mock->expects($this->exactly(1))
     ->method('display')
     ->will($this->returnValue(null));
$mock->expects($this->exactly(1))
     ->method('process');
person FMaz008    schedule 29.04.2011
comment
Вы можете использовать once() вместо exactly(1). Имейте в виду, что это не создает упорядочения между двумя ожиданиями, но обычно этого достаточно. Если вам требуется конкретный заказ, используйте at($index). - person David Harkness; 29.04.2011