Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 543
Marcelo Avatar asked Dec 14 '22 12:12

Marcelo


2 Answers

You can use:

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

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

like image 54
celtric Avatar answered Dec 17 '22 00:12

celtric


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.

like image 37
Alexander Guz Avatar answered Dec 17 '22 01:12

Alexander Guz