因为我现在正在对我的引导程序进行单元测试(是的,我知道你们中的大多数人都不这样做),所以我遇到了同样的问题(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!');
}