Тестирование интерактивных ремесленных команд с использованием Mockey - PullRequest
0 голосов
/ 18 марта 2019

Я пишу модульные тесты для интерактивных команд в Laravel 5.3, следуя этому руководству , но я не могу заставить Mockery работать.

Я настроил простую команду, приветствовать: пользователь .

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

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

И пишу юнит-тесты как;

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

1 Ответ

0 голосов
/ 18 марта 2019

Чтобы решить проблему, вам нужно вызвать тест следующим образом:

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);
}

Решающим фактором является регистрация команды.Вы должны сделать это, чтобы фактически заменить существующий экземпляр команды на ваш макет.

...