Тестирование интерактивных ремесленных команд с использованием Mockey

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
}

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

Я дал это когда-то, но я просто не могу заставить его работать. Themsaid объясняет это здесь: themessaid.com/building-testing-interactive-console-20160409, но я застрял.

bmatovu 18.03.2019 14:37

Для вас важно использовать метод artisan в классе TestCase и имитировать консольное ядро. Использование фасада Artisan позволит обойти имитированные экземпляры.

Borisu 18.03.2019 14:42

Ты не против помочь мне? Я создал простое репо, чтобы продемонстрировать это. github.com/mtvbrianking/тест-ремесленник-команда

bmatovu 18.03.2019 14:44

Я посмотрю и опубликую запрос на включение.

Borisu 18.03.2019 14:45

Я был бы признателен за это. Спасибо

bmatovu 18.03.2019 14:55

Привет, пробовал заставить работать с 5.7 версией консольных тестов, но пришлось бы менять столько файлов, думаю не стоит. Проверьте исправленный ответ для рабочего решения (согласно присланному вами руководству).

Borisu 21.03.2019 09:01

Другие вопросы по теме