我正在为我们的项目实现测试用例,以便包含在我们的构建脚本中。这个CakePHP 2.4应用程序主要基于REST,并已设置为在其routes.php文件中解析json扩展。以下是我们的应用程序中典型函数的示例:
public function index() {
$this->paginate = array(
'fields' => array('User.username', 'User.first_name', 'User.last_name', 'UserGroup.name','Location.name','User.id'),
'conditions' => array(
'active'=>1
),
'link' => array('UserGroup','Location')
);
$this->set('response', $this->RestApi->getResponse());
$this->set('_serialize','response');
}
这会返回一个像这样的json结构:
{"sEcho":1,"iTotalRecords":16,"iTotalDisplayRecords":14,"aaData":[["admin","Administrative"],["salesman","Salesman"]]}
所以我期望在编写我的测试用例时,在调用此URL时我会收到一个JSON响应,我的一个测试是正确解码它并继续验证数据。问题是,对testAction的调用什么都不返回(我试过告诉它返回视图和内容)。我能够访问响应的唯一方法是查看返回变量。
示例 - 不工作:
$result = $this->testAction('/users/index.json',array(
'method' => 'GET',
'return' => 'contents'
));
var_dump($result); // NULL
示例 - 正在工作:
$result = $this->testAction('/users/index.json',array(
'method' => 'GET',
'return' => 'vars'
));
那么看看变量有什么问题?对于一个它来说,它比应用程序如何工作的真实世界的例子更进一步。如果我无法按预期工作基本单元测试,这也让我对架构有点担心。
请告知并感谢阅读!
编辑:我应该补充一点,即使对非休息网址执行testAction,例如只返回HTML,我仍然没有得到任何响应。没有HTML等...
答案 0 :(得分:0)
我最终解决了这个问题。必须禁用Auth组件。有一些关于如何在测试中自己做这个的博客和讨论主题,但是在每个测试中重复相同的代码似乎很乏味。我的解决方案是在测试运行时自动禁用Auth组件。
在AppController :: beforeFilter中:
// For Mock Objects and Debug >= 2 allow all (this is for PHPUnit Tests)
if(preg_match('/Mock_/',get_class($this)) && Configure::read('debug') >= 2){
$this->Auth->allow();
}
我觉得这很优雅,因为我们更关心部署的核心功能。我们可能会返回并创建一个单元测试来验证Auth / ACL组件是否按预期工作。