CakePHP单元测试不返回内容或视图

时间:2013-10-21 20:57:28

标签: unit-testing cakephp phpunit cakephp-2.0

我正在为我们的项目实现测试用例,以便包含在我们的构建脚本中。这个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等...

1 个答案:

答案 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组件是否按预期工作。