【问题标题】:Proper way to unit test beforeFilter() and beforeRender() in AppController在 AppController 中对 beforeFilter() 和 beforeRender() 进行单元测试的正确方法
【发布时间】:2013-05-04 10:54:36
【问题描述】:

我正在为一个使用 CakePHP 2.3 的新网站编写单元测试。一切都很顺利,除了一件事。我想测试 beforeFilter() 和 beforeRender() 函数。 beforeFilter() 我可以通过创建一个模拟对象来轻松测试

$app_controller_mock = $this->generate(
    'App',
    array(
        'components' => array(
            'Session'
        )
    )
);
$app_controller_mock->beforeFilter();

这将运行该函数,但它不会给我有用的东西,如$this->vars$this->content 等。在这个特定的函数上没关系,但在我的 beforeRender() 中,我手动设置了 viewVar我想在我的测试用例中检查。

$app_controller_mock->beforeRender();
$this->assertNotNull($this->vars['controller_name'], "'controller_name' viewVar is null");

当我执行上述操作时,我收到以下错误:

'controller_name' viewVar is null
Failed asserting that null is not null.

这样做的“正确”方法是什么?

【问题讨论】:

  • 不确定,但 viewVar 不应该位于 $app_controller->viewVars['xxx'] 中吗?
  • 他们是。不过,我想使用内置的 testAction() 。我想手动调用它并且只是检查 viewVars 暂时可以工作。如果我的应用程序变得更加复杂,尽管它可能会变得多毛。
  • @Derek 我刚刚发布了一个答案,刚刚注意到这个问题有多老,但我希望它对未来的人有所帮助(因为我相信你已经找到了一个适合你的解决方案现在)

标签: php unit-testing cakephp cakephp-2.0


【解决方案1】:

我通常会发送一个完整的请求,以确保所有集成组件都存在于beforeFilterbeforeRender

有时,虚拟控制器很有帮助:

App::uses('ControllerTestCase', 'TestSuite');
App::uses('AppController', 'Controller');
class MockFiltersController extends AppController {
    public $controllerVar = 'something';

    public function action($var1 = null) {
        // can be helpful to set other vars, or
        // set something on the controller
        $this->controllerVar = $var1;
        $this->set(compact($var1));
    }
}

class AppControllerTest extends ControllerTestCase {

    public function testBeforeRender() {
        $this->testAction('/mock_filters/action/test', array(
            'method' => 'GET'
        ));
        // ensure view vars are set
        $this->assertEquals('test', $this->vars['var1']);
        // other assertions for beforeRender items
    }

}

然后重复beforeFilter,必要时使用generate() 进行模拟。

$this->varscontentview 等变量仅在使用ControllerTestCase::testAction 运行集成测试时设置。

使用这种方法对我来说似乎很有效,因为我可以检查控制器本身更改的变量、与各种组件的集成,当然还有设置的视图变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2012-01-05
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多