Reputation: 1762
In pure PHPUnit mocking I can do something like this:
$mock->expects($this->at(0))
->method('isReady')
->will($this->returnValue(false));
$mock->expects($this->at(1))
->method('isReady')
->will($this->returnValue(true));
I was not able to do the same thing using Prophecy. Is it possible?
Upvotes: 5
Views: 7690
Reputation: 164
You can use:
$mock->isReady()->willReturn(false, true);
Apparently it's not documented (see https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8).
Upvotes: 12
Reputation: 1364
There is another documented way to do that. If you expect a different result on a second call, it means something has changed in between, and you probably used a setter to modify the object's state. This way you can tell your mock to return a specific result after calling a setter with specific argument.
$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]);
});
More about it here https://github.com/phpspec/prophecy#method-prophecies-idempotency.
Upvotes: 3