You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:19:56