在同一个mocked方法上构建具有多个选项的UnitTest

时间:2014-07-07 07:10:56

标签: php cakephp phpunit

我有一个问题就是测试类似的方法

public function index(){

    if($this->request->is('get')){

        if($this->Session->check('saveConflict')){
            $this->set('conflict',true);
        }else{
            $this->set('data','test');
        }

        if($this->Session->check('full')){
            $this->set('data',$this->Model->find('all'));
        }else{
            $this->set('data','test');
        }

    }else{
        throw new BadRequestException;

    }
}

除非这种方法可能没有意义,否则这是我的问题。我必须在Session-Component上调用方法“check”两次。但我想要的是,例如第一个方法模拟调用重新打造“假”,第二个重新打造“真实”。

这就是我所拥有的

        $this->Editors->Session
        ->expects($this->once())
        ->method('check')
        ->will($this->returnValue(true));

我已经通过订单索引对期望“$ this-> at(1)”进行了尝试。但我认为这不是很聪明,因为如果我添加一个Session->检查解释方式的任何地方,但我的基本方法,例如我必须更改所有这些测试行,以使其再次正常工作。

我使用CakePHP 2.4.6和php-unit 4.1.3。

还有其他为什么要做我想做的事情吗?

1 个答案:

答案 0 :(得分:0)

使用

->will($this->onConsecutiveCalls(array('return_value1',
                                        'retur_value2',
                                        ...)));

按照你想要的顺序给出返回值的序列,模拟的方法将按顺序返回它。或者你可以尝试$this->returnCallback做一些复杂的自定义。你可以在这里找到这个例子{{3 }}

实施例
如果您只是想进行单元测试并涵盖所有路径,我会这样做:

public function testIndex()
{
  ....
  $this->Editors->Session
    ->expects($this->any())
    ->method('check')
    ->will($this->returnCallback(array($this,'sessionCallback')));
  $this->object->index();
  $this->object->index();
  .....
}
private $sessionFlag;
public function sessionCallback($value)
{
  $rtnValue = $this->sessionFlag[$value];
  $this->sessionFlag[$value] = (!$rtnValue);
  return $rtnValue;
}