使用MakeGood插件时已经发送了标头

时间:2012-03-20 18:22:09

标签: php zend-framework phpunit makegood

在Eclipse中使用MakeGood插件运行设置标题的测试时,我得到:

Cannot modify header information - headers already sent by (output started at C:\wamp\bin\php\php5.3.8\pear\PHPUnit\Util\Printer.php:173)

当我通过Phing运行它时,同样的测试工作正常。我假设Phing将输出设置为stderr,因为当我使用--stderr开关从phpunit命令行运行相同的测试时,它工作正常。如果不使用--stderr切换,它会与使用MakeGood的方式失败。

有没有解决方法,或者在MakeGood插件中设置输出到stderr的方法?

此外,这应该没有任何区别,但这是一个Zend Framework项目,我已经设置了

Zend_Session::$_unitTestEnabled = true; 

在我的测试引导程序中。

1 个答案:

答案 0 :(得分:2)

问题是PHPUnit会在屏幕上打印一个标题,此时PHP无法再发送标题。

解决方法是在一个独立的过程中运行测试。这是一个例子

<?php

class FooTest extends PHPUnit_Framework_TestCase
{
    /**
     * @runInSeparateProcess
     */
    public function testBar()
    {
        header('Location : http://foo.com');
    }
}

这将导致:

$ phpunit FooTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 1 second, Memory: 9.00Mb

OK (1 test, 0 assertions)

关键是@runInSeparateProcess注释。

运行PHPUnit时也可以使用--process-isolation标志。

如果您正在编写Zend Framework的代码,则不应直接使用header()。你应该使用Zend_Http_Response。

此外,如果您正在进行MVC级别测试,我建议您查看Zend_Test_PHPUnit