如何在PHPUnit中捕获Laravel命令$this->info()等方法的控制台输出
Laravel 9.x PHPUnit捕获控制台命令输出方案
放弃直接调用
$cmd->test->getActualOutput()的方式,改用Laravel内置的Artisan测试工具,它能自动捕获info()、error()、warn()方法的输出:- 执行目标命令:
Artisan::call('你的命令名称', ['参数名' => '参数值', '--选项' => '选项值']); - 获取完整输出:
这个返回值包含所有带ANSI颜色标记的输出内容,可直接用于断言。$fullOutput = Artisan::output();
- 执行目标命令:
便捷断言方式:
用链式调用直接验证输出和退出码,无需手动获取输出:$this->artisan('你的命令名称') ->expectsOutput('预期的info输出文本') ->expectsOutputToContain('预期的warn输出片段') ->expectsOutputToContain('预期的error输出片段') ->assertExitCode(0);
原理说明
Laravel的info()/error()/warn()方法基于Symfony的OutputInterface实现输出,直接操作命令实例的test属性无法正确绑定框架的输出流。而Artisan测试工具已经预先配置好了输出捕获逻辑,能完整捕获所有框架层面的控制台输出。
内容的提问来源于stack exchange,提问作者grizzlybears
相关产品推荐
相关产品推荐

