せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【PHPUnit】header関数を使用する時には@runInSeparateProcess

header関数はその実行前に何らかの標準出力があるとエラーになる。
(Cannot modify header information)

PHPUnit はテスト中のメッセージを逐一標準出力しているため、テスト内でheader関数を実行するとエラーになるというわけ。

覚えておいて頂きたいのは、 header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

http://php.net/manual/ja/function.header.php


実際にコードを書いてみると、「テスト中のメッセージを逐一標準出力している」(= headers_sent関数がtrue)
なのは指摘の通りだったけれど、headers_list関数は空配列だった。

出力しているのになぜ空配列!?

HTTP出力についてきちんと向き合わないとなあ。。

 
#ここはコードに語ってもらう方が分かりやすいので。。

<?php
class SessionTest extends PHPUnit_Extensions_OutputTestCase
{
  public function test1(){
    $this->assertSame(headers_sent(), true);
    print var_dump(headers_list()); 
  }

  /**
     * @runInSeparateProcess
     */
  public function test2(){
    $this->assertSame(headers_sent(), false);
  }
}

結果↓

.array(0) {
}

Time: 5 seconds, Memory: 4.75Mb
OK (2 tests, 2 assertions)