我开始在zend框架中为应用程序编写一些单元测试。 环顾四周,我来到了PHPunit,然后是Zend_Test(后来扩展了PHPunit)。
所以我选择用Zend_Test编写测试,因为它给了我一些特定于zend框架的断言......
一切顺利,直到我必须检查测试响应头...
我的直觉是使用$this->assertHeader($headerNameToCheckIfItExists)
断言。不幸的是失败。
所以我开始环顾四周为什么它失败了......我检查了我的应用程序在响应中设置了标题(并且它正确地设置了)然后我用curl
检查了原始响应Http标题。应用程序的设置标题似乎出现在响应中!
那么问题是什么?
问题是在zend应用程序中,可以使用$this->setHeader($headerName, $headerValue)
方法和$this->setRawHeader($headerNameAndHeaderValue)
方法设置标头。还有$this->getHeaders()
和$this->getRawHeaders()
分别将标题作为键值对的数组或纯字符串数组。 (在源代码中查看我发现有两个不同的标头数组 - 一个带有键值元素,另一个带有普通的字符串元素)
在我的应用中,我使用$this->setRawHeader($headerNameAndHeaderValue)
而$this->assertHeader($headerNameToCheckIfItExists)
失败。如果我使用$this->setHeader($headerName, $headerValue)
,则$this->assertHeader($headerNameToCheckIfItExists)
不会失败......
所以看来$this->assertHeader($headerNameToCheckIfItExists)
通过只查看$headerNameToCheckIfItExists
来检查$this->getResponse()->getHeaders()
标题名称是否存在!
如果有人知道这篇文章中有关这个“缺点”的答案,请。
我做的解决方法是重载我的测试用例文件中的$this->assertHeader($headerNameToCheckIfItExists)
:
public function assertHeader($header, $message='') {
$all_headers = array();
foreach ($this->getResponse()->getRawHeaders() as $str) {
$components = explode(":", $str);
$all_headers[] = array('name' => $components[0],
'value' => trim($components[1]),
'replace' => false);
}
$all_headers = array_merge($all_headers, $this->getResponse()->getHeaders());
foreach ($all_headers as $h)
if ($h['name'] == $header)
return $this->assertTrue(true, $message);
$this->fail('no header with name: '.$header);
}
我的zend框架版本:
zf show version
Zend Framework Version: 1.10.6