6
考虑以下代码:CakePHP的控制器测试与安全组件
控制器代码
<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
public $components = array(
'Security',
'Session'
);
public function example() {
if ($this->request->is('post')) {
$this->set('some_var', true);
}
}
}
查看代码
<?php
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->end('Submit');
因为我已经制定了安全组件,篡改以任何方式(如向其添加字段)都会导致请求为黑色-h OLED。我想测试:
测试代码
<?php
class UsersControllerTest extends ControllerTestCase {
public function testExamplePostValidData() {
$this->Controller = $this->generate('Users', array(
'components' => array(
'Security'
)
));
$data = array(
'User' => array(
'name' => 'John Doe'
)
);
$this->testAction('/users/example', array('data' => $data, 'method' => 'post'));
$this->assertTrue($this->vars['some_var']);
}
public function testExamplePostInvalidData() {
$this->Controller = $this->generate('Users', array(
'components' => array(
'Security'
)
));
$data = array(
'User' => array(
'name' => 'John Doe',
'some_field' => 'The existence of this should cause the request to be black-holed.'
)
);
$this->testAction('/users/example', array('data' => $data, 'method' => 'post'));
$this->assertTrue($this->vars['some_var']);
}
}
第二个测试testExamplePostInvalidData
应该因为some_field
的$data
阵列中是失败了,但它传递!我究竟做错了什么?
这个答案让我想起只检查视图在GET上返回的内容的可能性,并查看它是否包含不应该可编辑的字段。然后,知道安全组件已启用,我知道我很安全。但我认为我的测试仍然有意义,因为测试不关心你的实现是什么;测试只关心结果。因此,发布不应该可编辑的字段的结果应该导致错误,无论是否由安全组件生成(测试不关心)。但我认为这个答案足够了。谢谢! – Nick 2013-05-28 05:44:01