如何在Prophecy中模拟相同的方法,以便在每个调用中返回不同的响应

时间:2015-09-01 16:22:10

标签: php tdd bdd prophecy

在纯PHPUnit模拟中,我可以这样做:

$mock->expects($this->at(0))
    ->method('isReady')
    ->will($this->returnValue(false));

$mock->expects($this->at(1))
    ->method('isReady')
    ->will($this->returnValue(true));

我无法使用预言做同样的事情。有可能吗?

2 个答案:

答案 0 :(得分:4)

您可以使用:

$mock->isReady()->willReturn(false, true);

显然没有记录(见https://gist.github.com/gquemener/292e7c5a4bbb72fd48a8)。

答案 1 :(得分:2)

还有另一种记录的方法。如果你期望在第二次调用时得到不同的结果,则意味着两者之间发生了变化,你可能使用了一个setter来修改对象的状态。这样,您可以在调用具有特定参数的setter后告诉mock返回特定结果。

$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