14

PHPUnitを使用して一連のRESTWebサービスをテストしています。応答をgzipでエンコードするために、出力バッファリングを使用しています。PHPUnitを使用してサービスのテストを実行すると、次のエラーが発生します。

Cannot modify header information - headers already sent by (output started at /home/dotcloud/php-env/share/php/PHPUnit/Util/Printer.php:172)

私のコードエコーがブラウザへの出力であるという点で不平を言っています...

テストクラスの先頭に呼び出しを追加することで一時的にこれを回避できましたob_start()が、一度に複数のテストを実行すると、このエラーが再び発生します。

何か案は?

4

1 に答える 1

21

さまざまな長所と短所を持ついくつかのオプションがあります。

  1. @runInSeparateProcessすでにわかっているように、を使用して別々のプロセスでテストを実行します。良い:テストの分離が向上する、悪い:パフォーマンスが低下する、グローバル定数ではうまく機能しない
  2. フラグを使用--stderrして、PHPUnit の出力を STDERR に送信します。良い:テストは変更しなくても期待どおりに機能します,悪い:汚い回避策のように感じます, CI ツールに問題がある可能性があります
  3. 実際にはヘッダーを送信しません。使用するクラスheader()をスタブに置き換えるか、これが簡単にできない場合、または完全な機能テストを行いたい場合は、header()関数自体をモックします。組み込み関数のモックの詳細については、この回答を参照してください。良い:ヘッダーの内容もテストできます。テストはグローバル状態にあまり依存しません。悪い:より多くのテスト コードを記述する必要があります。

私は(3)に行き、おそらくコードもリファクタリングして、ヘッダーを担当し、簡単にモックできる単一のクラスを作成します。

于 2015-12-14T17:41:28.733 に答える