Test PHP headers with PHPUnit

后端 未结 7 1410
不思量自难忘°
不思量自难忘° 2020-11-30 22:05

I\'m trying to use PHPunit to test a class that outputs some custom headers.

The problem is that on my machine this:



        
相关标签:
7条回答
  • 2020-11-30 22:16

    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.

    0 讨论(0)
  • 2020-11-30 22:24

    Use --stderr parameter for getting headers from PHPUnit after your tests.

    phpunit --stderr
    
    0 讨论(0)
  • 2020-11-30 22:26

    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');
    }
    
    0 讨论(0)
  • 2020-11-30 22:28

    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.

    0 讨论(0)
  • 2020-11-30 22:32

    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) but xdebug_get_headers() works instead.

    HTH

    0 讨论(0)
  • 2020-11-30 22:33

    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.

    0 讨论(0)
提交回复
热议问题