在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;
在我的测试引导程序中。
答案 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。