我有以下抽象类:
abstract class Voter
{
public function vote()
{
$this->something();
$this->something();
$this->voteFoo();
$this->voteBar();
}
public function __call($method, $args)
{
//...
}
abstract public function something();
}
voteFoo
和voteBar
由__call
处理。
我想断言vote()
同时调用voteFoo()
和voteBar()
,我该怎么做?
我尝试使用$this->at(..)
,但它给了我一个错误:
$voter = $this->getMockForAbstractClass('Voter', array(), '', true, true, true, array('__call'));
$voter->expects($this->any())
->method('something')
->will($this->returnValue(true));
$voter->expects($this->at(0))
->method('__call')
->with($this->equalTo('voteFoo'));
$voter->expects($this->at(1))
->method('__call')
->with($this->equalTo('voteBar'));
$voter->vote();
*********** ERROR *************
Expectation failed for method name is equal to <string:__call> when invoked at
sequence index 0.
Mocked method does not exist.
修改:
如果我将$this->at()
中的值更改为 2 和 3 ,则测试通过,这意味着由于某种原因,$this->something()
也会触发__call
方法。
这个 Voter 类不是我真正的 Voter 类,它是问题的简单版本。在我真正的课堂上,我不知道会被叫__call
多少次。
答案 0 :(得分:0)
the docs并不完全清楚,但您应该可以使用returnValueMap
:
$voter->expects($this->any())
->method('something')
->will($this->returnValue(true));
$argumentMap = array(
array('voteFoo'),
array('voteBar')
);
$voter->expects($this->exactly(2))
->method('__call')
->will($this->returnValueMap($argumentMap));
答案 1 :(得分:0)
当计算所有函数调用时,这是PHPunit错误。错误已修复3.7版本