Тести консолі

Вступ

На додаток до спрощення HTTP тестування, Laravel надає простий API для тестування ваших власних консольних команд застосунку.

Успіх / Невдача Очікування

Щоб почати, давайте розглянемо, як робити твердження щодо коду виходу команди Artisan. Для цього ми будемо використовувати метод artisan, щоб викликати команду Artisan з нашого тесту. Потім ми використаємо метод assertExitCode, щоб стверджувати, що команда завершилася з певним кодом виходу:

test('console command', function () {
$this->artisan('inspire')->assertExitCode(0);
});
/**
* Тест консольної команди.
*/
public function test_console_command(): void
{
$this->artisan('inspire')->assertExitCode(0);
}

Ви можете використовувати метод assertNotExitCode, щоб перевірити, що команда не завершилася з певним кодом виходу:

$this->artisan('inspire')->assertNotExitCode(1);

Звичайно, всі термінальні команди зазвичай завершуються зі статус-кодом 0, коли вони успішні, і з ненульовим кодом виходу, коли вони не успішні. Тому, для зручності, ви можете використовувати твердження assertSuccessful та assertFailed, щоб перевірити, чи завершилася дана команда з успішним кодом виходу чи ні:

$this->artisan('inspire')->assertSuccessful();
 
$this->artisan('inspire')->assertFailed();

Вхідні / Вихідні Очікування

Laravel дозволяє легко "імітувати" введення користувача для ваших консольних команд, використовуючи метод expectsQuestion. Крім того, ви можете вказати код виходу та текст, який ви очікуєте, що буде виведено консольною командою, використовуючи методи assertExitCode та expectsOutput. Наприклад, розгляньте наступну консольну команду:

Artisan::command('question', function () {
$name = $this->ask('Як вас звати?');
 
$language = $this->choice('Якій мові ви надаєте перевагу?', [
'PHP',
'Ruby',
'Python',
]);
 
$this->line('Ваше ім’я — '.$name.' і ви надаєте перевагу '.$language.'.');
});

Ви можете перевірити цю команду за допомогою наступного тесту:

test('console command', function () {
$this->artisan('question')
->expectsQuestion('Як вас звати?', 'Taylor Otwell')
->expectsQuestion('Якій мові ви надаєте перевагу?', 'PHP')
->expectsOutput('Ваше ім’я — Тейлор Отвелл, і ви надаєте перевагу PHP.')
->doesntExpectOutput('Ваше ім’я — Тейлор Отвелл, і ви надаєте перевагу Ruby.')
->assertExitCode(0);
});
/**
* Тест консольної команди.
*/
public function test_console_command(): void
{
$this->artisan('question')
->expectsQuestion('Як вас звати?', 'Taylor Otwell')
->expectsQuestion('Якій мові ви надаєте перевагу?', 'PHP')
->expectsOutput('Ваше ім’я — Тейлор Отвелл, і ви надаєте перевагу PHP.')
->doesntExpectOutput('Ваше ім’я — Тейлор Отвелл, і ви надаєте перевагу Ruby.')
->assertExitCode(0);
}

Якщо ви використовуєте функції search або multisearch, надані Laravel Prompts, ви можете використовувати твердження expectsSearch для імітації введення користувача, результатів пошуку та вибору:

test('console command', function () {
$this->artisan('example')
->expectsSearch('Як вас звати?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
});
/**
* Тест консольної команди.
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsSearch('Як вас звати?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
}

Ви також можете перевірити, що консольна команда не генерує жодного виводу, використовуючи метод doesntExpectOutput:

test('console command', function () {
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
});
/**
* Тест консольної команди.
*/
public function test_console_command(): void
{
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
}

Методи expectsOutputToContain та doesntExpectOutputToContain можуть бути використані для перевірки частини виводу:

test('console command', function () {
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
});
/**
* Тест консольної команди.
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
}

Очікування підтвердження

Коли пишете команду, яка очікує підтвердження у формі відповіді "так" або "ні", ви можете використовувати метод expectsConfirmation:

$this->artisan('module:import')
->expectsConfirmation('Ви справді хочете виконати цю команду?', 'no')
->assertExitCode(1);

Очікування таблиці

Якщо ваша команда відображає таблицю інформації за допомогою методу Artisan table, може бути незручно писати очікування виводу для всієї таблиці. Замість цього ви можете використовувати метод expectsTable. Цей метод приймає заголовки таблиці як перший аргумент і дані таблиці як другий аргумент:

$this->artisan('users:all')
    ->expectsTable([
        'ID',
        'Email',
    ], [
        [1, 'example@example.com'],
        [2, 'example@example.com'],
    ]);

Події консолі

За замовчуванням події Illuminate\Console\Events\CommandStarting та Illuminate\Console\Events\CommandFinished не відправляються під час виконання тестів вашого застосунку. Однак, ви можете увімкнути ці події для певного тестового класу, додавши трейта Illuminate\Foundation\Testing\WithConsoleEvents до класу:

<?php
 
use Illuminate\Foundation\Testing\WithConsoleEvents;
 
uses(WithConsoleEvents::class);
 
// ...
<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\WithConsoleEvents;
use Tests\TestCase;
 
class ConsoleEventTest extends TestCase
{
use WithConsoleEvents;
 
// ...
}