如何在 Prophecy 中模拟相同的方法,使其在每个调用中 returns 有不同的响应
How to mock the same method in Prophecy so it returns different response in each of its calls
在纯 PHPUnit 模拟中,我可以做这样的事情:
$mock->expects($this->at(0))
->method('isReady')
->will($this->returnValue(false));
$mock->expects($this->at(1))
->method('isReady')
->will($this->returnValue(true));
我无法使用 Prophecy 做同样的事情。可能吗?
您可以使用:
$mock->isReady()->willReturn(false, true);
显然没有记录(参见 https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8)。
还有另一种已记录的方法可以做到这一点。如果您希望在第二次调用时得到不同的结果,则意味着两者之间发生了某些变化,并且您可能使用了 setter 来修改对象的状态。通过这种方式,您可以在使用特定参数调用 setter 后告诉模拟 return 特定结果。
$mock->isReady()->willReturn(false);
$mock->setIsReady(true)->will(function () {
$this->isReady()->willReturn(true);
});
// OR
$mock->setIsReady(Argument::type('boolean'))->will(function ($args) {
$this->isReady()->willReturn($args[0]);
});
更多信息请点击这里 https://github.com/phpspec/prophecy#method-prophecies-idempotency。
在纯 PHPUnit 模拟中,我可以做这样的事情:
$mock->expects($this->at(0))
->method('isReady')
->will($this->returnValue(false));
$mock->expects($this->at(1))
->method('isReady')
->will($this->returnValue(true));
我无法使用 Prophecy 做同样的事情。可能吗?
您可以使用:
$mock->isReady()->willReturn(false, true);
显然没有记录(参见 https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8)。
还有另一种已记录的方法可以做到这一点。如果您希望在第二次调用时得到不同的结果,则意味着两者之间发生了某些变化,并且您可能使用了 setter 来修改对象的状态。通过这种方式,您可以在使用特定参数调用 setter 后告诉模拟 return 特定结果。
$mock->isReady()->willReturn(false);
$mock->setIsReady(true)->will(function () {
$this->isReady()->willReturn(true);
});
// OR
$mock->setIsReady(Argument::type('boolean'))->will(function ($args) {
$this->isReady()->willReturn($args[0]);
});
更多信息请点击这里 https://github.com/phpspec/prophecy#method-prophecies-idempotency。