ちょいとPHPを触る機会があり、検索しても出てこない現象に出くわしたのでメモ。
header関数を含むテストコードをphpunitで実行すると、headers already sent by ~
というエラーで失敗してしまうことがある。
これはheader関数以前に標準出力処理を含む場合に発生するようだ。
この場合、テストメソッドに @runInSeparateProcess
アノテーションを付加すると解消するが
今度は Constant SRC_DIR already defined in ~
というエラーで失敗してしまうようになった。
これはphpunitの処理上の問題で、アノテーション付加によって内部的な定数の反映順が悪さをしてしまうのが原因らしい。
細かいことは置いておいて、以下コードの追加で解決した。
/**
* runInSeparateProcessアノテーション付加に伴う定数定義の反映順変更
*/
public function prepareTemplate(Text_Template $template)
{
$template->setVar( array(
'constants' => '',
'zz_constants' => PHPUnit_Util_GlobalState::getConstantsAsString()
));
parent::prepareTemplate($template);
}
よくある謎のおまじないっぽい……。
参考
- header() 関数はその実行前に何らかの標準出力がされていると「Cannot modify header information」というエラーを吐いてしまいます。PHPUnit はテスト中のメ…
- This weekend, some WordPress core devs ported the unit tests over to a new phpunit compatible runner. I was very excited about this, particularly because the te...