PHPUnit 输出导致Zend_Session异常

2022-08-30 16:06:02

我得到了许多与此完全相同的错误:

Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /usr/local/zend/share/pear/PHPUnit/Util/Printer.php/173

运行应用程序的测试套件时。这是PHPUnit 3.5.10和PHP 5.3.5。

没有神秘的、意外的空格输出导致这种情况。我已经确定“发送到浏览器的输出”是正在执行的PHPUnit测试的实际输出。如果我打开 PHPUnit/Util/Printer.php并将该行换行(有效地停止了 PHPUnit 的第一行输出),那么我的第一个测试就成功了(直到测试用例输出一个点,指示测试成功,然后下一个测试失败,因为点被输出了)。print $bufferif (strpos($buffer, 'PHPUnit 3.5.10 by Sebastian Bergmann') === false)

我团队中的另一位开发人员能够成功运行完整的测试套件,因此我知道这不是应用程序代码的问题。它必须是某些配置设置或我的本地环境存在问题。

我已经检查了php.ini来验证它已打开并已关闭,并且它们确实如此。output_bufferingimplicit_flush

我也尝试过添加到我的测试引导中,但这没有帮助(无论如何都没有必要,因为它可以在另一个开发人员的计算机和没有它的CI服务器上工作)。Zend_Session::$_unitTestEnabled = true;

除了忽略错误之外,还有什么建议吗?我从来没有见过这样的事情,我真的不知所措。

谢谢!

更新:

为了进一步隔离问题,我通过执行以下测试脚本将采埃孚和我的应用程序从等式中剔除:

<?php

class SessionTest extends PHPUnit_Framework_TestCase
{
    public function testSession()
    {
        session_start();
        $this->assertTrue(true);
    }
}

测试失败:

1) SessionTest::testSession
session_start(): Cannot send session cookie - headers already sent by (output started at /home/mmsa/test.php:1)

但是,完全相同的测试适用于朋友的机器。相同版本的 PHP 和 PHPUnit。


答案 1

使用 -stderr 标志运行 phpunit(较新的版本可能使用 --stderr 代替),例如

 phpunit -stderr mytest.php
 # or
 phpunit --stderr mytest.php

这会将 phpunit 的输出定向到 stderr,防止它中断 HTTP 标头生成。

测试可能在您朋友的计算机上工作,因为他启用了输出缓冲(尽管我不确定这是否与CLI上下文相关)。


答案 2

我认为更好的方法是使用

Zend_Session::$_unitTestEnabled = true;

在我的测试引导中使用它可以防止此错误。


推荐