在测试中发送标头时发生PHPUnit web测试错误

在测试中发送标头时发生PHPUnit web测试错误,php,rest,symfony,phpunit,Php,Rest,Symfony,Phpunit,我已经用symfony编写了一个restapi。它接受Json请求并生成带as响应的格式化pdf 我想写一个phpunitweb测试,它将检查响应状态和头数据 public function test_getCertificate() { $client = $this->getClient(['username'=>'user','password'=>'xxxxxx']); $client->request( 'GET',

我已经用symfony编写了一个restapi。它接受Json请求并生成带as响应的格式化pdf

我想写一个phpunitweb测试,它将检查响应状态和头数据

public function test_getCertificate()
{
    $client = $this->getClient(['username'=>'user','password'=>'xxxxxx']);

    $client->request(
        'GET',
        '/api/v1/certificate',
        array(),
        array(),
        array('CONTENT_TYPE' => 'application/json'),
        null
    );

    $this->assertEquals(200, $client->getResponse()->getStatusCode());

    $this->assertTrue(
        $client->getResponse()->headers->contains(
            'Content-Type',
            'application/x-download'
        )
    );

    $this->assertTrue(
        $client->getResponse()->headers->contains(
            'Content-Disposition',
            'attachment; filename="el_certificate.pdf"'
        )
    );
}
问题是,当运行测试时,PHPUnit已经启动输出标头,然后我的控制器就无法生成PDF:

Uncaught PHP Exception Exception: "FPDF error: Some data has already been output, can't send PDF file"
header()由我无法修改的库代码调用。当我尝试用ob_end_clean()清除测试脚本中的输出缓冲区或用ob_start()启动新缓冲区时,出现异常:

Uncaught PHP Exception PHPUnit_Framework_Error_Warning: "Cannot modify header information - headers already sent by (output started at /usr/share/php/PHPUnit/Util/Printer.php:134)"
版本
PHP7.2.2-3+ubuntu16.04.1+deb.sury.org+1
PHPUnit 5.1.3

如何处理这种情况有什么建议吗

编辑: 我尝试在单独的过程中运行此测试:

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */
public function test_getCertificate()
{
    //...
}
然后,我得到了一个错误:

PHP Warning:  Uncaught require_once(/var/cache/test/jms_diextra/doctrine/EntityManager_5a9419b75e6b1.php): failed to open stream: No such file or directory

/vendor/symfony/phpunit-bridge/DeprecationErrorHandler.php:108
/var/cache/test/appTestDebugProjectContainer.php:2456
/var/cache/test/appTestDebugProjectContainer.php:2456
/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php:329
/var/cache/test/appTestDebugProjectContainer.php:8179
/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php:329
/var/cache/test/appTestDebugProjectContainer.php:7994
/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php:329
/var/cache/test/appTestDebugProjectContainer.php:7954
/var/www/html/elearning-ap in /var/cache/test/appTestDebugProjectContainer.php on line 2456
PHP Fatal error:  appTestDebugProjectContainer::getDoctrine_Orm_DefaultEntityManagerService(): Failed opening required '/var/cache/test/jms_diextra/doctrine/EntityManager_5a9419b75e6b1.php' (include_path='.:/usr/share/php') in /var/cache/test/appTestDebugProjectContainer.php on line 2456
test_getPhases
{"error":{"code":500,"message":"Internal Server Error","exception":[{"message":"Compile Error: appTestDebugProjectContainer::getDoctrine_Orm_DefaultEntityManagerService(): Failed opening required '\/var\/cache\/test\/jms_diextra\/doctrine\/EntityManager_5a9419b75e6b1.php' (include_path='.:\/usr\/share\/php')","class":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","trace":[{"namespace":"","short_class":"","class":"","type":"","function":"","file":"\/var\/cache\/test\/appTestDebugProjectContainer.php","line":2456,"args":[]}]}]}}

好吧,我终于知道发生了什么

如果PHPUnit应该测试一些发出头的代码(例如,generate file),那么测试应该在一个单独的进程中运行。可以做到这一点:

在我的例子中,JMSDiExtraBundle产生了错误,因为它将其包装在自己的代理对象中。如果不希望JMSDiExtra为条令生成代理类,则可以添加以下配置:

jms_di_extra:
    doctrine_integration: false
之后,测试可以在单独的进程中正常运行,而不会出现标题输出问题

jms_di_extra:
    doctrine_integration: false