PHPUnitでheader関数を使うメソッドのテスト

投稿日:

まだ冬は本気をだしていないぞ〜。

以前こんな PHPUnitでajaxから呼ばれるモジュール(jsonをecho)のテストをする自分の解 | Shimabox Blogのを書きました。
その時はよく分からずmockを使えばうんたらかんたらみたいなことを書いちゃったのですが、最近同じようなケースがありまして、えぇ、調べ直したら実に簡単な方法があったのでメモっておきます。

ちなみに、PHPUnitのバージョンは4.8.31です。

以前のやり方


まぁ、こんな感じです。
HTTPヘッダを送信する処理(header使うところ)を関数にして、渡される引数をチェックするという算段でした。
これでも(多分)いいんだけど、他にも方法がありました。

他の方法

ポイント

ポイントは以下の通り。

  • アノテーションで@runInSeparateProcessを定義する
    • そのテストが個別のPHPプロセスで実行される
  • ob_end_clean() で出力バッファをクリア(消去)し、出力のバッファリングをオフにする
  • 似た関数でob_clean()があるが、こっちは出力制御を継続するので、これ(ob_clean())を使うとOK, but incomplete, skipped, or risky tests!と怒られる

まとめ

つまり、header関数は呼ばれる前に標準出力(PHPUnitを実行するとメッセージが黒い画面に出力されますよね)があると怒られてしまうが、

Cannot modify header information - headers already sent by ...

テストを別プロセスにして一つ一つきちんと標準出力を制御すればOKという事ですね。
お勉強になりました。

参考にさせて頂きました

投稿日:
カテゴリー: PHPUnitPHP

作成者: shimabox

Web系のプログラマをやっています。 なるべく楽しく生きていきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください