PHPUnit: how do I mock multiple method calls with multiple arguments?
In my case the answer turned out to be quite simple:
$this->expects($this->at(0)) ->method('write') ->with(/* first set of params */);$this->expects($this->at(1)) ->method('write') ->with(/* second set of params */);
The key is to use $this->at(n)
, with n
being the Nth call of the method. I couldn't do anything with any of the logicalOr()
variants I tried.
For others who are looking to both match input parameters and provide return values for multiple calls.. this works for me:
$mock->method('myMockedMethod') ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2]) ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);
Stubbing a method call to return the value from a map
$map = array( array('arg1_1', 'arg2_1', 'arg3_1', 'return_1'), array('arg1_2', 'arg2_2', 'arg3_2', 'return_2'), array('arg1_3', 'arg2_3', 'arg3_3', 'return_3'),);$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->will($this->returnValueMap($map));
Or you can use
$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->will($this->onConsecutiveCalls('return_1', 'return_2', 'return_3'));
if you don't need to specify input arguments