模拟一个方法,根据调用的顺序返回不同的结果

时间:2014-09-05 18:20:01

标签: mocking phpunit expectations

我想模拟一个在第一次调用时返回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'));

有办法做到这一点吗?

1 个答案:

答案 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()调用的警告,因为它确实将测试与实现细节紧密联系在一起。