在PHPUnit中,如何在连续调用模拟方法时指出与()不同?

我想用不同的预期参数两次调用我的模拟方法。 这是行不通的,因为expects($this->once())在第二次调用时会失败。

 $mock->expects($this->once()) ->method('foo') ->with('someValue'); $mock->expects($this->once()) ->method('foo') ->with('anotherValue'); $mock->foo('someValue'); $mock->foo('anotherValue'); 

我也试过了:

 $mock->expects($this->exactly(2)) ->method('foo') ->with('someValue'); 

但是,如何添加一个with()来匹配第二个调用呢?

你需要使用at()

 $mock->expects($this->at(0)) ->method('foo') ->with('someValue'); $mock->expects($this->at(1)) ->method('foo') ->with('anotherValue'); $mock->foo('someValue'); $mock->foo('anotherValue'); 

请注意,传递给at()的索引将跨所有方法调用应用于相同的模拟对象。 如果第二个方法调用是bar()你不会改变at()的参数。

从类似问题的答案中引用,

自PHPUnit 4.1以来,您可以使用与withConsecutive如。

 $mock->expects($this->exactly(2)) ->method('set') ->withConsecutive( [$this->equalTo('foo'), $this->greaterThan(0)], [$this->equalTo('bar'), $this->greaterThan(0)] ); 

如果您想让它在连续通话中返回:

  $mock->method('set') ->withConsecutive([$argA1, $argA2], [$argB1], [$argC1, $argC2]) ->willReturnOnConsecutiveCalls($retValueA, $retValueB, $retValueC); 

如果你可以避免使用at()这是不理想的,因为他们的文档声称

at()匹配器的$ index参数指向给定模拟对象的所有方法调用中从零开始的索引。 使用这个匹配器时要小心,因为它会导致脆弱的testing,这与特定的实现细节密切相关。