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?
There are several options with different advantages and disadvantages:
@runInSeparateProcess
, as you already found out. Good: better test isolation, Bad: worse performance, does not work well with global constants--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 toolsheader()
with stubs or if this is not easily possible or you want to do a full functional test, mock the header()
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 codeI'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.