在PHPUnit中使用不同参数调用测试方法

时间:2012-11-28 21:40:15

标签: mocking phpunit

我有以下抽象类:

abstract class Voter
{
    public function vote()
    {
        $this->something();
        $this->something();

        $this->voteFoo();
        $this->voteBar();
    }

    public function __call($method, $args)
    {
        //...
    }

    abstract public function something();
}

voteFoovoteBar__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多少次。

2 个答案:

答案 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版本