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'
));

那么看 vars 有什么问题呢?好吧,它比应用程序如何工作的真实示例更进一步。如果我不能让基本的单元测试按预期工作,这也让我有点担心架构。

请建议并感谢您的阅读!

编辑:我应该补充一点,即使对非休息网址执行 testAction,例如只返回 HTML 的网址,我仍然没有得到任何响应。没有HTML等...

4

1 回答 1

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

于 2013-11-07T15:12:19.923 回答