PHPUnit:如何将多个调用模拟为同一个方法

时间:2018-04-02 05:44:19

标签: php unit-testing phpunit

我希望在多次调用时为同一方法获取不同的返回值。我尝试过很多东西,但没有得到确切答案。

$mock = $this->getMockBuilder('Test')
                ->disableOriginalConstructor()
                ->setMethods(array('testMethod'))
                ->getMock();
$mock->expects($this->once())->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->second())->method('testMethod')->will($this->returnValue(false));

2 个答案:

答案 0 :(得分:5)

您可以使用willReturnOnConsecutiveCalls方法

$mock
    ->expects($this->exactly(2))
    ->method('testMethod')
    ->willReturnOnConsecutiveCalls(true, false);

替代方案(对于phpunit< 4):

$mock
    ->expects($this->exactly(2))
    ->method('testMethod')
    ->will($this->onConsecutiveCalls(true, false));

答案 1 :(得分:1)

我找到了this链接,这有助于我使用at($index)方法完成此操作。它返回一个匹配器,该匹配器在给定的$index处调用它所评估的方法时匹配。

$index匹配器的at()参数在给定模拟对象的所有方法调用中引用从零开始的索引。使用此匹配器时要小心,因为它可能导致脆弱的测试,这些测试与特定的实现细节过于紧密相关。 More Details

$mock = $this->getMockBuilder('Test')
                ->disableOriginalConstructor()
                ->setMethods(array('testMethod'))
                ->getMock();
$mock->expects($this->at(0))->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->at(1))->method('testMethod')->will($this->returnValue(false));