【问题标题】:Problems with unit testing ZF2 form with CSRF使用 CSRF 对 ZF2 表单进行单元测试的问题
【发布时间】:2015-04-11 07:09:53
【问题描述】:

我正在尝试对 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 值并获得表单可以接受的新值?

【问题讨论】:

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


    【解决方案1】:

    我不确切知道您是如何配置测试的,但 bootstrap the application 在测试之间很常见,因此您可以在所有服务等重新初始化的情况下运行第二个测试。

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

    【讨论】:

    • 这基本上是我用于测试的引导文件。虽然我没有编写 tearDown 方法 - 有什么我可以放入其中来清除这样的东西吗?
    猜你喜欢
    • 2011-07-17
    • 2020-07-28
    • 2011-01-29
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多