27

次のようなエラーが多数発生しています。

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_bufferingがオンになってimplicit_flushいてオフになっていることを確認しました。

テストブートストラップにも追加しようとしましZend_Session::$_unitTestEnabled = true;たが、それは役に立ちませんでした (別の開発者のマシンとそれなしの CI サーバーで動作するため、とにかく必要ではないはずです)。

エラーを無視する以外に何か提案はありますか? 私はこのようなものを見たことがなく、本当に途方に暮れています。

ありがとう!

アップデート:

問題をさらに特定するために、次のテスト スクリプトを実行して、ZF とアプリケーションを方程式から外しました。

<?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 の同じバージョン。

4

5 に答える 5

37

-stderr フラグを指定して phpunit を実行します (新しいバージョンでは代わりに --stderr を使用する場合があります)。

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

これにより、phpunit の出力が stderr に送られ、HTTP ヘッダーの生成が中断されなくなります。

友人のマシンで出力バッファリングが有効になっているため、テストが機能する可能性があります (ただし、それが CLI コンテキストに関連するかどうかはわかりません)。

于 2011-04-01T03:20:51.153 に答える
6

より良い方法は使用だと思います

Zend_Session::$_unitTestEnabled = true;

これをテスト ブートストラップで使用すると、このエラーを防ぐことができます。

于 2014-01-08T15:14:25.887 に答える
1

システムの PHPUnit で使用されている php バイナリが CLI バージョンではなく CGI である場合、session_start実際に Cookie を設定しようとすると、そのエラーが発生します。

を呼び出して、使用している SAPI を確認できますphp_sapi_name

于 2011-04-01T03:01:35.543 に答える
0

私は別のプロジェクトで同じ問題を抱えていました.テストを実行する前にウェルカムメッセージを出力するため、PHPUnitが出力を開始するのが早すぎることが問題であることがわかりました.

に次の 2 行を追加しましたbootstrap.php

ini_set('session.use_cookies', 0);
ini_set('session.cache_limiter', '');

これにより、テスト スイートが実行される前にヘッダーが送信されるのを防ぐことができます。

于 2014-02-07T19:54:13.230 に答える