我开始为 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()
分别将标头作为键值对数组或纯字符串数组获取。(查看源代码,我发现有 2 个不同的标头数组 - 一个带有键值元素,另一个带有纯字符串元素)
在我的应用程序中,我使用了$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