如何为Cakephp 3 PHPunit测试创建CSRF令牌?

时间:2015-06-29 15:02:30

标签: unit-testing cakephp csrf cakephp-3.0

我在CakePHP 3应用程序中启用CSRF令牌和SSL后,试图让我的单元测试再次运行。

如何为以下测试创建或生成令牌?或者我只是为了测试目的而禁用它?

public function testLogin() {
    $this->get('/login');
    $this->assertResponseOk();

    $data = [
        'email' => 'info@example.com',
        'password' => 'secret'
    ];
    $this->post('/login', $data);

    $this->assertResponseSuccess();
    $this->assertRedirect(['controller' => 'Users', 'action' => 'dashboard']);
}

2 个答案:

答案 0 :(得分:3)

官方文件has good approach since version 3.1.2

您只需在帖子前致电$this->enableCsrfToken();和/或$this->enableSecurityToken();,以便能够使用令牌成功执行请求。

正如官方示例所示:

public function testAdd()
{
    $this->enableCsrfToken();
    $this->enableSecurityToken();
    $this->post('/posts/add', ['title' => 'Exciting news!']);
}

答案 1 :(得分:2)

只需通过ControllerIntergrationTestCase::cookie()在Cookie中设置令牌,并通过POST数据传递令牌。默认情况下,要使用的Cookie名称为csrfToken,POST数据键必须为_csrfToken

CSRF令牌不需要使用任何特定格式,CSRF组件只会测试字符串是否相等。

$token = 'my-csrf-token';

$this->cookie('csrfToken', $token);

$data = [
    'email' => 'info@example.com',
    'password' => 'secret',
    '_csrfToken' => $token
];
$this->post('/login', $data);

请注意,cookie一直保留到拆解,即。当前测试中的每个子队列请求都将使用配置的cookie。