【问题标题】:Testing interactive artisan commands using Mockey使用 Mockey 测试交互式工匠命令
【发布时间】:2019-08-08 18:59:03
【问题描述】:

我正在按照guide 在 Laravel 5.3 中为交互式命令编写单元测试,但我似乎无法让 Mockery 工作。

我设置了一个简单的命令,greet:user

public function handle()
{
    if(!$name = $this->argument('name')) {
        $name = $this->ask('Name of user to greet');
    }

    $this->info("Hello {$name}.");
}

我正在写unit-testslike;

public function testCanGreetGivenUser()
{
    $command = Mockery::mock('App\Console\Commands\GreetUser[info]');

    $command->shouldReceive('info')->once()->with('Hello Brian.');

    $exit_code = Artisan::call('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
    $this->assertEquals(trim(Artisan::output()), 'Hello Brian.');
    $this->assertEquals($exit_code, 0);
}

问题:

Mockery\Exception\InvalidCountException: Method info("Hello Brian.") from Mockery_0_App_Console_Commands_GreetUser should be called exactly 1 times but called 0 times.

我的目标是测试;

如果不需要输入

$this->artisan('greet:user', ['name' => 'Brian'])
    ->expectsOutput('Hello Brian.')
    ->assertExitCode(0);

如果需要输入。

$this->artisan('greet:user')
    ->expectsQuestion('Name of user to greet', 'James')
    ->expectsOutput('Hello James.')
    ->assertExitCode(0);

这就是我在 Laravel 5.7 中可以做到的方式,但我如何才能在 Laravel 5.3 中做到这一点

【问题讨论】:

    标签: laravel unit-testing laravel-artisan mockery


    【解决方案1】:

    要解决问题,您必须按如下方式调用测试:

    public function testCanGreetGivenUser()
    {
        $command = Mockery::mock('\App\Console\Commands\GreetUser[info]');
    
        $command->shouldReceive('info')->once()->with('Hello Brian.');
    
        $this->app[\Illuminate\Contracts\Console\Kernel::class]->registerCommand($command);
    
        $exit_code = $this->artisan('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
        $this->assertEquals($exit_code, 0);
    }
    

    决定因素是命令注册。您必须这样做才能用您的模拟实际替换现有的命令实例。

    【讨论】:

    猜你喜欢
    • 2016-03-15
    • 2021-01-29
    • 2015-06-24
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2019-03-14
    • 2014-08-30
    相关资源
    最近更新 更多