I\'m trying to use PHPunit to test a class that outputs some custom headers.
The problem is that on my machine this:
I had a more radical solution, in order to use $_SESSION
inside my tested/included files.
I edited one of the PHPUnit files at ../PHPUnit/Utils/Printer.php to have a "session_start();"
before the command "print $buffer".
It worked for me like a charm. But I think "joonty" user's solution is the best of all up to now.
Use --stderr parameter for getting headers from PHPUnit after your tests.
phpunit --stderr
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');
}
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
An alternative solution to @runInSeparateProcess is to specify the --process-isolation option when running PHPUnit:
name@host [~/test]# phpunit --process-isolation HeadersTest.php
That is analogous to set the processIsolation="true" option in phpunit.xml.
This solution has similar advantages/disadvantages to specifying the --stderr option, which however did not work in my case. Basically no code changes are necessary, even though there may be a performance hit due to running each test in a separate PHP process.