yii2单元测试失败无错误信息,需三步硬配置:确保tests/bootstrap.php末行是(new yii\web\application($config));在config/test.php中配好errorhandler及erroraction;运行phpunit时加-v参数。

单元测试失败时看不到错误信息,基本等于没跑测试——Yii2 默认不会把异常堆栈透给 PHPUnit 或 Codeception,必须手动打通错误输出链路。
为什么 var_dump() 和 echo 在测试里不显示
PHPUnit 运行时会捕获 stdout/stderr,且 Yii2 的 ErrorHandler 在 test 环境下默认仍走 HTML 渲染逻辑(哪怕你没配 errorAction),导致异常被静默吞掉或转成空响应。
- 在
tests/bootstrap.php中未执行(new yii\web\Application($config))→Yii::$app为 null,所有组件调用失败但无提示 -
config/test.php缺少'response' => ['format' => \yii\web\Response::FORMAT_JSON]→ 错误仍尝试渲染 HTML 视图,而视图路径不存在,触发新异常被掩盖 - 测试类未继承
Codeception\Test\Unit或yii\test\TestCase→$this->expectException()等断言失效,异常直接终止进程却不输出
让 PHPUnit 显示真实报错的三步硬配置
不是加个 try/catch 就能看见错误,得从启动入口掐住 Yii 应用初始化和错误捕获点:
- 确认
tests/bootstrap.php最后一行是(new yii\web\Application($config));,不能写成$app = new ...或注释掉 - 在
config/test.php的components里显式配好errorHandler:'errorHandler' => ['errorAction' => 'site/error'],并确保controllers/SiteController.php存在actionError()(哪怕只返回return ['error' => $exception->getMessage()]) - 运行时加
-v参数:执行./vendor/bin/phpunit -v tests/unit/YourTest.php,否则 PHPUnit 默认只报“Failed”不打堆栈
常见失败现象与对应修复点
看到这些表现,基本能锁死问题位置:
- 报错
Class 'app\models\User' not found→ 检查tests/bootstrap.php是否加载了vendor/autoload.php,且composer dump-autoload已执行 - 报错
Connection is not established→config/test.php里'db'组件配置无效,或数据库服务根本没启(别信 localhost:3306 一定通) - 测试通过但
$this->assertNotNull(Yii::$app)失败 →bootstrap.php中YII_ENV写成了'dev'而非'test',导致 Yii 加载了 web 配置而非 test 配置
最易忽略的是:tests/bootstrap.php 里 require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; 必须在 autoload.php 之后、new Application 之前——顺序错一毫秒,整个应用上下文就建不起来,后面所有错误都变成“找不到类”或“空对象调用”。











