我想模拟一个在第一次调用时返回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'));
有办法做到这一点吗?
答案 0 :(得分: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()调用的警告,因为它确实将测试与实现细节紧密联系在一起。