Как смоделировать один и тот же метод в Prophecy, чтобы он возвращал разные ответы при каждом вызове

В чистом насмешке PHPUnit я могу сделать что-то вроде этого:

$mock->expects($this->at(0))
    ->method('isReady')
    ->will($this->returnValue(false));

$mock->expects($this->at(1))
    ->method('isReady')
    ->will($this->returnValue(true));

Я не смог сделать то же самое, используя Пророчество. Является ли это возможным?

2 ответа

Решение

Ты можешь использовать:

$mock->isReady()->willReturn(false, true);

По-видимому, это не задокументировано (см. https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8).

Есть еще один документированный способ сделать это. Если вы ожидаете другого результата при втором вызове, это означает, что между ними что-то изменилось, и вы, вероятно, использовали установщик для изменения состояния объекта. Таким образом, вы можете сказать своему макету возвращать определенный результат после вызова метода установки с определенным аргументом.

$mock->isReady()->willReturn(false);

$mock->setIsReady(true)->will(function () {
    $this->isReady()->willReturn(true);
});

// OR

$mock->setIsReady(Argument::type('boolean'))->will(function ($args) {
    $this->isReady()->willReturn($args[0]);
});

Подробнее об этом здесь https://github.com/phpspec/prophecy.

Другие вопросы по тегам