- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为一个使用 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)一个完整的请求,以确保存在 beforeFilter
和 beforeRender
的所有集成组件。
有时,虚拟 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->vars
、content
、view
等变量只在使用ControllerTestCase::testAction时设置
运行集成测试。
使用这种方法对我来说似乎很有效,因为我可以检查在 Controller 本身上更改的变量、与各种组件的集成,当然还可以查看正在设置的变量。
关于php - 在 AppController 中对 beforeFilter() 和 beforeRender() 进行单元测试的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470680/
我有一个 BeforeRender 事件的订阅者函数。每次发出请求时,都会调用此函数。 这里我想分析给定的请求 url 但我无法访问 request.application_url 或 request
我正在将 Yii1 中开发的旧应用程序迁移到 Yii2。 我曾经在 Controller 中有一个数组,用于存储我需要作为 JavaScript 发送到前端的所有变量: public $jsVars;
我正在尝试在我的网站中添加语言支持,并且我需要添加此代码,以便它能够在所有 View 中呈现 Marionette 之前运行,无论哪种类型。 onBeforeRender: function(){
我正在为一个使用 CakePHP 2.3 的新站点编写单元测试。一切都很顺利,除了一件事。我想测试 beforeFilter() 和 beforeRender() 函数。 beforeFilter()
我是一名优秀的程序员,十分优秀!