如何测试实现CSRF元素的Zend framework2表单?

时间:2014-09-24 04:48:22

标签: zend-framework zend-framework2 phpunit

我使用 Zend / Form 创建了登录表单,它包含输入元素和CSRF元素。

<!-- sample login.phtml code snippet -->
<form method="post" action="/xyz">
<?php
 echo $this->formelement($form->get('email'));
 echo $this->formelement($form->get('password'));
 echo $this->formelement($form->get('csrf'));
 echo $this->formelement($form->get('submit'));
?>
</form>

由于针对CSRF元素的验证,以下测试用例失败。

public function testLogin()
{      
  //code goes here
  $params = array('email' => 'example@test.com', 'password' => 'example@test.com');
  $this->dispatch($url, $method, $params);
  //if the given username and password is correct the login page redirected to default home page
  $this->assertResponseStatusCode(302);
}

在上面的测试用例中,我设置了电子邮件和密码值,但我不知道如何设置CSRF元素。我怎样才能测试实现CSRF元素的表单?

1 个答案:

答案 0 :(得分:1)

这可以通过以下方式轻松实现:

    $form = new LoginForm();
    $csrf = $form->get('csrf')->getValue();
    $params = array('email' => 'example@test.com', 
                    'password' => 'example@test.com', 
                    'csrf' => $csrf
    );

除非你的表单需要表单管理器,否则你不得不使用它而不仅仅是实例化类,但在单元测试中也很容易。

更新:

另一种有效的方法:

    $form = new LoginForm();
    $form->prepare();

    $params = new \Zend\Stdlib\Parameters(
                    array(
                            'csrf' => $_SESSION['Zend_Validator_Csrf_salt_csrf']['hash'],
                            'yourotherparams' => 'thingsandstuff'
            );


    $this->dispatch($url, $method, $params);