私は今ブートストラップをユニットテストしているので(そうです、ほとんどの人はそうしないことを知っています)、同じ問題(header()とsession_start()の両方)に遭遇しています。私が見つけた解決策はかなり単純です。ユニットテストのブートストラップで定数を定義し、ヘッダーを送信する前、またはセッションを開始する前に定数を確認するだけです。
// phpunit_bootstrap.php
define('UNITTEST_RUNNING', true);
// bootstrap.php (application bootstrap)
defined('UNITTEST_RUNNING') || define('UNITTEST_RUNNING', false);
.....
if(UNITTEST_RUNNING===false){
session_start();
}
これは設計上完全ではないことに同意しますが、既存のアプリケーションを単体テストしているため、大きなパーツを書き直すことは望ましくありません。また、同じロジックを使用して、__ call()および__set()マジックメソッドを使用してプライベートメソッドをテストします。
public function __set($name, $value){
if(UNITTEST_RUNNING===true){
$name='_' . $name;
$this->$name=$value;
}
throw new Exception('__set() can only be used when unittesting!');
}