投稿日:
まだ冬は本気をだしていないぞ〜。
以前こんな 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という事ですね。
お勉強になりました。
参考にさせて頂きました
- PHPUnit マニュアル – 付録B アノテーション
- header() 関数を使ったメソッドを PHPUnit でテストする方法 – Qiita
- そのままだと
OK, but incomplete, skipped, or risky tests!
とやっぱり怒られるけど、ob_end_clean()
を使ったら大丈夫でした。PHPUnitのバージョン違い??
- そのままだと