2

注: これは重複した質問ではありません。同様の質問をいくつか見ましたが、単体テストについて質問しています。

CakePHP 2.3.6 を使用してテスト ケースを作成しようとしていますが、header() 関数を使用するテスト ケースに問題があります。テストはブラウザーからは問題なく実行されますが、コマンド ラインからは次のエラーが表示されます。

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

たとえば、私のコードの次の行でエラーが発生しています。

header( 'Content-Type: application/json; charset=utf-8' );

PHPUnit では @runInSeparateProcess を使用してこれを回避できますが、CakePHP では代わりに次のエラーが発生します。

Notice: Constant TIME_START already defined in /app/lib/Cake/bootstrap.php on line 22
Notice: Constant CAKE already defined in /app/lib/Cake/bootstrap.php on line 48
Notice: Constant APPLIBS already defined in /app/lib/Cake/bootstrap.php on line 60
Notice: Constant SECOND already defined in /app/lib/Cake/basics.php on line 26
Notice: Constant MINUTE already defined in /app/lib/Cake/basics.php on line 27

等々。

私は立ち往生しています。誰もこれを処理する方法を知っていますか? よろしくお願いします。

4

5 に答える 5

1

ユニットテストが実際に何であるかを誤解しているに違いありません。したがって、ここでは、仕事に間違ったツールを使用していないことに注意してください。

たとえば、あなたの質問では次のように書いています。

たとえば、私のコードの次の行でエラーが発生しています。

header( 'Content-Type: application/json; charset=utf-8' );

このコード行は、PHPUnit を使用してテストできるコード行ではありません。Phpunit テストでそのようなコードを実行しようとしないでください。ここで常に問題が発生します。

行き詰まっていることを正しく書いているので、それは完全に理解できます。ただし、それは視点にもよります。一部の問題には、非常に明白な解決策があります。そうしないでください。代わりに、適切なツールを使用してテストします。たとえば、HTTP プロトコルを介してアプリケーションにアクセスする機能テストを使用して、HTTP 応答ヘッダーをテストできるようにします。PHPUnit はできません - まあ、ここで絶対に言わないでください: 少なくとも、あなたがそれを使用する方法ではありません (そして、私はあなたがそれを使用したいと思っていると思います)。

それができない場合は、ヘッダー エラーに関する正規の質問で、そのエラーを処理する方法の多くが概説されています。出力制御関数がテストで役立つ可能性があることが示唆されています。

その答えは、PHP からヘッダーを送信することについて知っておく必要があることもすべて教えてくれるはずなので、テスト対象のシステムをよりよく理解できます。

于 2013-09-27T13:30:44.720 に答える
1

「すでに送信されたヘッダー」に関する質問に対する他のすべての回答は正しいですが、あなたの場合、それはある種の専門です。PHPUnit は、ヘッダーを送信しようとするコードに実行される前に出力を送信するため、この状況を回避することはできません。

header()ただし、重要な点は次のとおりです。関数を使用することは想定されていません。CakeResponseそのためにオブジェクトを使用することになっています。私のクイックグーグルはこれを見つけました(明らかに2.0用であるため、おそらく更新されたドキュメントバージョンを見つける必要があります):http://book.cakephp.org/2.0/en/controllers/request-response.html#cakeresponse

このオブジェクトを使用すると、テスト プロセス全体header()でテスト実行中の呼び出しを回避できます。これは、http: //book.cakephp.org/2.0/en/controllers/request-response.html#cakeresponse-およびテスト

最後に、テストをスムーズに実行するには、次の基本的なルールがコードに適用されます。

  • headers()状況に依存する (最初がないことに依存するなど) PHP 関数を呼び出しechoたり、その状況を変更したりしないでください。
  • テストが必要な PHP 関数を呼び出さないでください (「呼び出しが発生している必要があるerror_log」など)。

これらの関数呼び出しはすべて、モックできるオブジェクトにラップする必要があります。

于 2013-09-27T07:54:03.907 に答える
0

ヘッダーを送信する前に出力を送信しないでください。

HTTP ヘッダーを送信/変更する関数は、出力が行われる前に呼び出す必要があります。それ以外の場合、呼び出しは失敗します。画面に出力されたエラー、または print または echo ステートメントを探します。

ここで受け入れられた回答を参照してください。

于 2013-09-27T04:07:59.620 に答える