0

我想模拟一个方法,该方法A在第一次调用B时返回,第二次调用时返回,所有后续调用都将返回C。我假设我可以使用$this->any()$this->at()获得期望的期望,但它似乎$this->any()总是优先。

// calls to foo() will always return 'C' even after the following setup
$this->expects($this->any())->method('foo')->will($this->returnValue('C'));
$this->expects($this->at(0))->method('foo')->will($this->returnValue('A'));
$this->expects($this->at(1))->method('foo')->will($this->returnValue('B'));

有没有办法做到这一点?

4

1 回答 1

3

我认为 any() 是问题所在。我相信你想要

$this->expects($this->at(0))->method('foo')->will($this->returnValue('A'));
$this->expects($this->at(1))->method('foo')->will($this->returnValue('B'));
$this->expects($this->at(2))->method('foo')->will($this->returnValue('C'));

由于您控制测试,因此您无需再进行任何调用或添加额外的 at() 引用。

另一种选择是 withConsecutive() 方法,它可以采用任意数量的参数数组(PHPUnit Mock Objects Manual)。

从手册:

$mock = $this->getMock('stdClass', array('set'));
$mock->expects($this->exactly(2))
     ->method('set')
     ->withConsecutive(
         array($this->equalTo('foo'), $this->greaterThan(0)),
         array($this->equalTo('bar'), $this->greaterThan(0))
     );

$mock->set('foo', 21);
$mock->set('bar', 48);

请注意有关 at() 调用的警告,因为它确实将测试与实现细节紧密联系在一起。

于 2014-09-05T19:39:03.433 回答