5

我试图学习如何在 CakePhp 中使用单元测试,我正在尝试编写一个控制器测试。我阅读了有关 testAction() 和 debug() 函数的信息,但它对我不起作用,我的意思是,测试方法通过了,但 debug() 返回 null (因为 testAction 确实如此)

这是我的代码:

<?php
App::uses('Controller', 'Controller');
App::uses('View', 'View');
App::uses('PostsController', 'Controller');

class PostsControllerTest extends ControllerTestCase {
    public function setUp() {
       parent::setUp();
       $Controller = new Controller();
       $View = new View($Controller);
       $this->Posts = new PostsController($View);
    }

    public function testIndex() {
          $result = $this->testAction('Posts/Index');
        debug($result);        

    }
}

Posts/index 控制器返回存储在数据库中的所有帖子的列表。

4

2 回答 2

10

我假设您使用的是 CakePHP 2。

$this->testAction()可以返回几个不同的结果,具体取决于您给它的选项。

例如,如果您将return选项设置为vars,该testAction()方法将返回已在测试操作中设置的变量数组:

public function testIndex() {
    $result = $this->testAction('/posts/index', array('return' => 'vars'));
    debug($result);
}

/posts/index在此示例中,调试数据应该是您在操作中设置的变量数组。

CakePHP 文档描述了您可以在此处返回的可能结果:http: //book.cakephp.org/2.0/en/development/testing.html#choosing-the-return-type

请注意,默认选项result为您提供控制器操作返回的值。对于大多数控制器操作,这将是null,因此您在示例中得到的事实null是可以预料的。

于 2012-09-22T10:33:38.650 回答
1

mtnorthrop 的回答确实对我有用,但只有一次我也处理了我的网站的授权。如果您的网站使用授权,那么 testAction('/action', array('return' => 'contents') 将返回 null。我已经看到了一些解决方案:

一种是遵循此处给出的解决方案: CakePHP Unit Test Not Returning Content or View 您在 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();
}

另一个是遵循此讨论中给出的建议:https ://groups.google.com/forum/#!topic/cake-php/ eWCO2bf5t98 并使用 ControllerTestCase 的 generate 函数模拟 Auth 对象:

class MyControllerTest extends ControllerTestCase {
    public function setUp() {
        parent::setUp();
        $this->controller = $this->generate('My',
            array('components' => array(
                'Auth' => array('isAuthorized')
            ))
        );
        $this->controller->Auth->expects($this->any())
            ->method('isAuthorized')
            ->will($this->returnValue(true));

    }
}

注意(我使用的是 CakePhp 2.3.8)

于 2014-04-09T21:52:36.093 回答