Laravel 11中如何测试含choice选项的Artisan命令?
测试Laravel 11中含choice选项的Artisan命令
核心原因
带choice选项的命令属于交互式命令,测试时不能直接断言输出——必须先模拟用户的选择输入,否则命令会卡在交互环节,导致输出断言失败。
正确测试步骤
1. 示例命令代码
以官方文档的问候命令为例:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class GreetCommand extends Command { protected $signature = 'greet'; protected $description = 'Greet a user'; public function handle() { $name = $this->choice( 'Who would you like to greet?', ['Taylor Otwell', 'Jeffrey Way', 'Adam Wathan'], 0 ); $this->info("Hello, {$name}!"); } }
2. 编写测试用例
使用Laravel测试工具的expectsChoice()方法模拟用户选择,再断言输出:
<?php namespace Tests\Feature\Console; use Tests\TestCase; class GreetCommandTest extends TestCase { public function test_greet_command_with_choice() { $this->artisan('greet') // 匹配命令中的choice提示文本,指定用户选择的选项 ->expectsChoice( 'Who would you like to greet?', 'Taylor Otwell', ['Taylor Otwell', 'Jeffrey Way', 'Adam Wathan'] ) // 断言最终输出内容 ->expectsOutput('Hello, Taylor Otwell!') // 断言命令正常退出 ->assertExitCode(0); } }
3. 关键注意事项
expectsChoice()的第一个参数必须和命令中choice方法的提示文本完全一致,包括空格、标点和大小写- 第三个参数的选项列表要和命令里的选项数组完全匹配,顺序也不能出错
- 测试不同选择结果时,只需修改
expectsChoice()的第二个参数,同步调整输出断言内容即可
常见错误排查
- 提示“Output does not contain XXX”:通常是因为未模拟用户选择,命令卡在交互步骤,没有生成最终输出
- 提示“Expected choice prompt XXX not found”:检查
expectsChoice()的提示文本是否和命令中的内容完全一致
内容的提问来源于stack exchange,提问作者friday-json
相关产品推荐
相关产品推荐

