问题
I'm testing a suite of REST web services with PHPUnit. We're using output buffering in order to gzip-encode the responses. When I run a test for the service with PHPUnit, I'm getting the error:
Cannot modify header information - headers already sent by (output started at /home/dotcloud/php-env/share/php/PHPUnit/Util/Printer.php:172)
It's complaining at the point that my code echo's the output to the browser...
I was able to work around this temporarily by adding an ob_start()
call at the top of the test class(es), but when I run multiple tests at once, I get this error again.
Any ideas?
回答1:
There are several options with different advantages and disadvantages:
- run the tests in separate processes with
@runInSeparateProcess
, as you already found out. Good: better test isolation, Bad: worse performance, does not work well with global constants - use
--stderr
flag to direct PHPUnit output to STDERR. Good: tests work as expected without changes, Bad: feels like a dirty workaround, possibly problems with CI tools - don't actually send headers. Either replace the classes that use
header()
with stubs or if this is not easily possible or you want to do a full functional test, mock theheader()
function itself. More info on mocking built-in functions in this answer. Good: you can test the contents of the headers as well, your tests do rely less on global state Bad: You'll need to write more test code
I'd go for (3) and probably refactor the code as well to have a single class that's responsible for the headers and can be easily mocked.
来源:https://stackoverflow.com/questions/14152608/headers-already-sent-error-returned-during-phpunit-tests