我正在使用带有Zend_Form的CSRF隐藏哈希元素并尝试单元测试登录但不知道如何编写单元测试以包含该元素.查看文档并阅读尽可能多的教程.我甚至都把它们全都搞熟了,但没有人提到这一点.
每次呈现表单时都会生成Csrf值.表单的隐藏元素预先填充该值.该值也存储在会话中.提交表单后,验证检查表单中发布的值是否存储在会话中,否则验证失败.至关重要的是,表单必须在测试期间呈现(因此它可以生成隐藏值并将其存储到会话中),然后我们可以从渲染的html中提取隐藏的值,稍后我们可以将隐藏的哈希值添加到我们的要求.考虑这个例子:
function testAddPageStoreValidData() { // render the page with form $this->dispatch('/form-page'); // fetch content of the page $html = $this->getResponse()->getBody(); // parse page content, find the hash value prefilled to the hidden element $dom = new Zend_Dom_Query($html); $csrf = $dom->query('#csrf')->current()->getAttribute('value'); // reset tester for one more request $this->resetRequest() ->resetResponse(); // now include $csrf value parsed from form, to the next request $this->request->setMethod('POST') ->setPost(array('title'=>'MyNewTitle', 'body'=>'Body', 'csrf'=>$csrf)); $this->dispatch('/form-page'); // ... }