Zend_Test_PHPUnit_ControllerTestCase中的assertHeader无法正常工作?

时间:2013-04-15 16:52:55

标签: php unit-testing zend-framework phpunit

我开始在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

0 个答案:

没有答案