2012-02-03 4 views
10

ヘッダーが既に送信されているため、失敗した単体テストがあります。ただし、このシナリオのヘッダーが必要です。期待されるヘッダーをテストするには?

PHPUnitに500ヘッダーがあると伝えるにはどうすればよいですか?

私はthis questionを読んだが、役に立たなかった。

このメソッドは、出力バッファ内にラップされます。

ob_start(); 
$foo->methodWhichSendsHeader(); 
ob_clean(); 
+1

あなたのケースで[この回答](http://stackoverflow.com/a/190498/212940)が正しくないことは確かですか? – vascowhite

答えて

19

xdebugがインストールされている場合は、xdebug_get_headers()を使用してヘッダーを取得できます。その後、必要に応じてテストすることができます。

$headers=xdebug_get_headers(); 

ですから、「あなたができる場合は値

+0

これは、フォーマット のヘッダ( 'Content-Type:text/html'); ' 'の呼び出しには効果がありますが、フォーマットの呼び出しでは機能しないようです 'header( 'HTTP/1.1 500 Internal Serverエラー ');' これらのヘッダー/ステータスコードを取得するにはどうしてですか? – Derokorian

+0

'header( 'HTTP/1.1 500 Internal Server Error');'から実際のヘッダの内容を取得することはできませんが、組み込みの[http_response_code()](http://php.net /manual/en/function.http-response-code.php)、ブラウザに返されるHTTPステータスコードを取得します。 – JSmitty

2

からヘッダー名を分離するために、各ヘッダ行を解析する必要があります

array(
    0 => "Content-type: text/html", 
    1 => ... 
) 

...あなたのように見えるの配列を取得しますシステム上でxdebug_get_headersを使用する方法もあります。もう1つの方法は、ヘッダー機能をモックすることです。

私は以下を使用しています。これはうまくいきます。次のようにテスト可能クラスが実装されている

<?php 
Testable::header('Content-type: text/plain; charset=UTF-8'); 
... 

...私はこのようなテスト可能であるヘッダー機能でheaderを交換...あなたはこのコードを持っている

<?php 
header('Content-type: text/plain; charset=UTF-8'); 
... 

を言うことができます。関数の先頭にはTestable::を付ける必要があることに注意してください。それ以外の場合は、通常の機能と全く同じ働きをします。

class Testable { 
    private static $headers=array(); 

    static function header($header) { 
     if (defined('UNIT_TESTING')) { 
     self::$headers[]=$header; 
     } else { 
     header($header); 
     } 
    } 

    public static function reset() { 
     self::$headers=array(); 
    } 

    public static function headers_list() { 
     if (defined('UNIT_TESTING')) { 
      return self::$headers; 
     } else { 
      return headers_list(); 
     } 
    } 
} 

今あなたがする必要があるすべては、生産にあなたのテストでUNIT_TESTINGを定義しますが、ではありません。その後、ヘッダーをテストするには、Testable::headers_list()に電話してください。

もちろん、setcookie、headers_sent、およびHTTPヘッダーを発行するその他の関数のメソッドを追加する必要があります。

+4

しかし、これはテストの主題を変更します。それは良いことではありません。 –

+0

@JimmyKane - 私が知る限り、どんなモック以上でもありません。実動コードUNIT_TESTINGが定義されていない限り、実動コードにTestable ::ヘッダーの呼び出しを残すことができます。私がここで紛失しているものはありますか? –

+1

私はあなたのクラスに静的関数を追加して、 'Testable'クラスを修正しなければならないということを意味しました。私は、テスト可能にするためにヘッダーを送るすべての要約で静的なこれを編集して追加したくありません。しかしそれはただの好みです。それ以外はあなたの答えは良いです。すてきな一日を。 –

関連する問題