Test PHP headers with PHPUnit
Although running the test in a separate process does fix the problem, there's a noticeable overhead when running a large suite of tests.
My fix was to direct phpunit's output to stderr, like so:
phpunit --stderr <options>
That should fix the problem, and it also means that you don't have to create a wrapper function and replace all occurrences in your code.
As an aside: For me headers_list()
kept returning 0 elements. I noticed @titel's comment on the question and figured it deserves special mention here:
Just wanted to cover this if there are some other people interested in this as well.
headers_list()
doesn't work while running PHPunit (which uses PHP CLI) butxdebug_get_headers()
works instead.
HTH
As already mentioned in a comment, I think it's a better solution to define processIsolation in the XML config file like
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
processIsolation = "true"
// ...
>
</phpunit>
Like this, you don't have to pass the --stderr option, which might irritate your co-workers.
The issue is that PHPUnit will print a header to the screen and at that point you can't add more headers.
The work around is to run the test in an isolated process. Here is an example
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @runInSeparateProcess
*/
public function testBar()
{
header('Location : http://foo.com');
}
}
This will result in:
$ phpunit FooTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
.
Time: 1 second, Memory: 9.00Mb
OK (1 test, 0 assertions)
The key is the @runInSeparateProcess annotation.
If you are using PHPUnit ~4.1 or something and get the error:
PHP Fatal error: Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in -:378
Stack trace:
#0 {main}
thrown in - on line 378
Fatal error: Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378
Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378
Call Stack:
0.0013 582512 1. {main}() -:0
Try add this to your bootstrap file to fix it:
<?php
if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
define('PHPUNIT_COMPOSER_INSTALL', __DIR__ . '/path/to/composer/vendors/dir/autoload.php');
}