PHPUnit:我如何模拟多个方法调用多个参数?

我正在为使用PHPUnit的方法编写unit testing。 我正在testing的方法在同一个对象上调用同一个方法3次,但使用不同的参数集。 我的问题类似于这里和这里提出的问题

在其他文章中提出的问题与嘲笑只有一个参数的方法有关。

但是,我的方法需要多个参数,我需要这样的东西:

$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->with($this->logicalOr($this->equalTo($arg1, $arg2, arg3....argNb), $this->equalTo($arg1b, $arg2b, arg3b....argNb), $this->equalTo($arg1c, $arg2c, arg3c....argNc) )) 

此代码不起作用,因为equalTo()只validation一个参数。 给它多个参数会引发一个exception:

PHPUnit_Framework_Constraint_IsEqual :: __ construct()的参数#2必须是数字

有没有办法做logicalOr嘲笑一个方法有多个参数?

提前致谢。

就我而言,答案非常简单:

 $this->expects($this->at(0)) ->method('write') ->with(/* first set of params */); $this->expects($this->at(1)) ->method('write') ->with(/* second set of params */); 

关键是使用$this->at(n) ,其中n是方法的第N个调用。 我无法做任何与我尝试的任何logicalOr()变种。

对方法调用进行存根,以从地图返回值

 $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)); 

或者你可以使用

 $mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->will($this->onConsecutiveCalls('return_1', 'return_2', 'return_3')); 

如果你不需要指定input参数

对于其他谁正在寻找匹配input参数,并提供多个来电的返回值..这对我来说很有效:

  $mock->method('myMockedMethod') ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2]) ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3); 

如果有人在phpunit文档中没有查看记者部分的话就可以使用withConsecutive方法

 $mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->withConsecutive( [$arg1, $arg2, $arg3....$argNb], [arg1b, $arg2b, $arg3b....$argNb], [$arg1c, $arg2c, $arg3c....$argNc] ... ); 

唯一的缺点是代码必须按提供的参数顺序调用MyMockedMethod 。 我还没有find解决办法。