Marcelo
Marcelo

Reputation: 1762

How to mock the same method in Prophecy so it returns different response in each of its calls

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

Answers (2)

celtric
celtric

Reputation: 164

You can use:

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

Apparently it's not documented (see https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8).

Upvotes: 12

Alexander Guz
Alexander Guz

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

Related Questions