我正在尝试使用CakePHP 2.2 RC1测试我的应用程序,在我的控制器的某个操作中我需要一个Auth对象的信息,在我的测试中我已经为Auth组件创建了一个模拟对象,但是当我调用该方法时 with 我的模拟对象变得无效,当我不把它放在一切正常时。
在模拟对象下方不起作用
$this->controller->Auth
->staticExpects($this->any())
->method('user')
->with('count_id')
->will($this->returnValue(9));
感谢您的关注。
-
修改
在我的测试用例的完整代码之上,这是一个非常简单的测试。
class TagsControllerTest extends ControllerTestCase {
public function testView(){
$Tags = $this->generate('Tags', array(
'components' => array(
'Session',
'Auth' => array('user')
)
));
$Tags->Auth->staticExpects($this->any())
->method('user')
->with('count_id')
->will($this->returnValue(2));
$result = $this->testAction('/tags/view');
$this->assertEquals($result, 2);
}
}
我在Tag控制器中的操作代码,这里没有更多(为了测试目的)他们返回一个用count_id作为参数的用户对象。
public function view(){
return $this->Auth->user('count_id');
}
运行测试我收到了这条消息:
方法名称的期望失败等于调用零次或多次时 调用AuthComponent :: user(null)的参数0与期望值不匹配。 声明null与预期的'count_id'匹配失败。
答案 0 :(得分:1)
在查看AuthComponent
代码之后,我认为问题在于你没有嘲笑整个组件或你没有嘲笑_getUser()
方法。不要忘记:你没有嘲笑的方法是真正的方法!
如果您查看代码,您会看到user()
调用了_getUser()
,startup()
又调用了AuthComponent
。
有两种方法可以解决这个问题,第一种是模拟整个$Tags = $this->generate('Tags', array(
'components' => array(
'Session',
'Auth' /* no methods */
)
));
:
_getUser()
除user()
之外或模拟$Tags = $this->generate('Tags', array(
'components' => array(
'Session',
'Auth' => array('user', '_getUser')
)
));
:
{{1}}
希望这可以解决您的问题。
答案 1 :(得分:1)
我遇到的问题是我提供的解决方案无法解决的问题。
解决方案是使用staticExpects()而不是expected(),因为用户是静态函数。
$batches->Auth->staticExpects($this->once())->method('user')
->with('id')
->will($this->returnValue(1));