我有一个问题就是测试类似的方法
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。
还有其他为什么要做我想做的事情吗?
答案 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;
}