Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти
Главная Laravel 10.x Тесты консоли

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

10.x 7 мар 2026 г.

#Введение

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

#Ожидания успеха / неудачи

Для начала рассмотрим, как делать утверждения относительно кода выхода Artisan-команды. Для этого мы используем метод artisan для вызова Artisan-команды из теста. Затем применим метод assertExitCode, чтобы проверить, что команда завершилась с заданным кодом выхода:

/**
 * Тест консольной команды.
 */
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('What is your name?');

    $language = $this->choice('Which language do you prefer?', [
        'PHP',
        'Ruby',
        'Python',
    ]);

    $this->line('Your name is '.$name.' and you prefer '.$language.'.');
});

Вы можете протестировать эту команду с помощью следующего теста, который использует методы expectsQuestion, expectsOutput, doesntExpectOutput, expectsOutputToContain, doesntExpectOutputToContain и assertExitCode:

/**
 * Test a console command.
 */
public function test_console_command(): void
{
    $this->artisan('question')
         ->expectsQuestion('What is your name?', 'Taylor Otwell')
         ->expectsQuestion('Which language do you prefer?', 'PHP')
         ->expectsOutput('Your name is Taylor Otwell and you prefer PHP.')
         ->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.')
         ->expectsOutputToContain('Taylor Otwell')
         ->doesntExpectOutputToContain('you prefer Ruby')
         ->assertExitCode(0);
}

#Ожидания подтверждения

При написании команды, которая ожидает подтверждения в виде ответа "да" или "нет", вы можете использовать метод expectsConfirmation:

$this->artisan('module:import')
    ->expectsConfirmation('Do you really wish to run this command?', 'no')
    ->assertExitCode(1);

#Ожидания таблицы

Если ваша команда выводит таблицу с помощью метода table Artisan, писать ожидания для всего вывода таблицы может быть неудобно. Вместо этого можно использовать метод expectsTable. Он принимает заголовки таблицы в первом аргументе и данные таблицы во втором:

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

#События консоли

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

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\WithConsoleEvents;
use Tests\TestCase;

class ConsoleEventTest extends TestCase
{
    use WithConsoleEvents;

    // ...
}