gpt4 book ai didi

php - 在 AppController 中对 beforeFilter() 和 beforeRender() 进行单元测试的正确方法

转载 作者:行者123 更新时间:2023-12-05 08:00:56 25 4
gpt4 key购买 nike

我正在为一个使用 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.

执行此操作的“正确”方法是什么?

最佳答案

我通常做的事情是分派(dispatch)一个完整的请求,以确保存在 beforeFilterbeforeRender 的所有集成组件。

有时,虚拟 Controller 很有用:

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时设置 运行集成测试。

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

关于php - 在 AppController 中对 beforeFilter() 和 beforeRender() 进行单元测试的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com