1

我开始为 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
4

0 回答 0