header関数を含むPHPテストコードでハマったこと

ちょいと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);
}

よくある謎のおまじないっぽい……。

参考

スポンサーリンク
レクタングル(大)
レクタングル(大)
スポンサーリンク
レクタングル(大)