使用CSRF进行ZF2单元测试的问题

时间:2015-02-11 02:13:53

标签: php forms unit-testing zend-framework2 csrf-protection

我试图对ZF2应用程序进行单元测试。我的表格根据学生或员工的不同而略有变化,我有两个独立的工厂来制作它们。

无论如何,我尝试在以下测试中测试学生表格:

public function testStudentFormAcceptsValidValues()
{
    $this->getEmMock();
    $this->mockLogin('admin');

    $form = $this->serviceManager->get('student_form');
    $this->getApplicationServiceLocator()->setService('student_form', $form);
    $url = '/user/account/add/student';
    $this->dispatch($url);
    $csrf = $form->get('csrf')->getValue();

    $postData = $this->userStubData[1];
    $postData['csrf'] = $csrf;
    $user = new UserEntity();

    $this->getApplicationServiceLocator()->setService('user_entity', $user);

    $this->dispatch($url, 'POST', $postData);

    $this->assertRedirectTo('/user#students');
    $this->assertEntityPropertiesSet($user, $postData);
}

当我运行此测试时,它会通过。但是,我正在对员工表单进行类似的测试,但由于CSRF令牌错误,它会失败。所以只是为了踢,我决定连续两次运行上面的测试,看看会发生什么。它再次失败,原因完全相同。

我最终决定检查两个测试的CSRF令牌值,我发现它们都是相同的。出于某种原因,表单重新使用了之前测试中的CSRF值,而不是创建一个新表单,因此表单拒绝了它。

我需要做些什么才能清除旧的CSRF值并获得表单接受的新值?

1 个答案:

答案 0 :(得分:0)

我不确切知道您是如何配置测试的,但测试之间bootstrap the application通常是这样,因此您可以使用所有服务等重新初始化运行第二次测试。

可能您的某些服务在第一次测试中初始化,第二次测试可能会使用第一次测试中的“错误”旧值重新使用已初始化的服务。