Я пишу модульные тесты для интерактивных команд в 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






Чтобы решить проблему, вам нужно будет вызвать тест следующим образом:
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);
}
Решающим фактором является регистрация команды. Вы должны сделать это, чтобы фактически заменить существующий экземпляр команды своим макетом.
Для вас важно использовать метод artisan в классе TestCase и имитировать консольное ядро. Использование фасада Artisan позволит обойти имитированные экземпляры.
Ты не против помочь мне? Я создал простое репо, чтобы продемонстрировать это. github.com/mtvbrianking/тест-ремесленник-команда
Я посмотрю и опубликую запрос на включение.
Я был бы признателен за это. Спасибо
Привет, пробовал заставить работать с 5.7 версией консольных тестов, но пришлось бы менять столько файлов, думаю не стоит. Проверьте исправленный ответ для рабочего решения (согласно присланному вами руководству).
Я дал это когда-то, но я просто не могу заставить его работать. Themsaid объясняет это здесь: themessaid.com/building-testing-interactive-console-20160409, но я застрял.