在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,这与特定的实现细节密切相关。