Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Pruebas de Consola

Pruebas de Consola

10.x 7 de mar. de 2026

#Introducción

Además de simplificar las pruebas HTTP, Laravel ofrece una API sencilla para probar los comandos personalizados de consola de su aplicación.

#Expectativas de Éxito / Fallo

Para comenzar, exploremos cómo hacer aserciones sobre el código de salida de un comando Artisan. Para ello, usaremos el método artisan para invocar un comando Artisan desde nuestra prueba. Luego, utilizaremos el método assertExitCode para afirmar que el comando terminó con un código de salida dado:

/**
 * Probar un comando de consola.
 */
public function test_console_command(): void
{
    $this->artisan('inspire')->assertExitCode(0);
}

Puede usar el método assertNotExitCode para afirmar que el comando no terminó con un código de salida dado:

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

Por supuesto, todos los comandos de terminal normalmente terminan con un código de estado 0 cuando tienen éxito y con un código distinto de cero cuando fallan. Por lo tanto, para mayor comodidad, puede utilizar las aserciones assertSuccessful y assertFailed para afirmar que un comando dado terminó con un código de salida exitoso o no:

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

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

#Expectativas de Entrada / Salida

Laravel le permite "simular" fácilmente la entrada del usuario para sus comandos de consola usando el método expectsQuestion. Además, puede especificar el código de salida y el texto que espera que el comando de consola produzca usando los métodos assertExitCode y expectsOutput. Por ejemplo, considere el siguiente comando de consola:

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

Puede probar este comando con la siguiente prueba que utiliza los métodos expectsQuestion, expectsOutput, doesntExpectOutput, expectsOutputToContain, doesntExpectOutputToContain y 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);
}

#Expectativas de Confirmación

Al escribir un comando que espera una confirmación en forma de respuesta "sí" o "no", puede utilizar el método expectsConfirmation:

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

#Expectativas de Tabla

Si su comando muestra una tabla de información usando el método table de Artisan, puede ser engorroso escribir expectativas de salida para toda la tabla. En su lugar, puede usar el método expectsTable. Este método acepta los encabezados de la tabla como primer argumento y los datos de la tabla como segundo argumento:

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

#Eventos de Consola

Por defecto, los eventos Illuminate\Console\Events\CommandStarting y Illuminate\Console\Events\CommandFinished no se despachan mientras se ejecutan las pruebas de su aplicación. Sin embargo, puede habilitar estos eventos para una clase de prueba dada agregando el trait Illuminate\Foundation\Testing\WithConsoleEvents a la clase:

<?php

namespace Tests\Feature;

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

class ConsoleEventTest extends TestCase
{
    use WithConsoleEvents;

    // ...
}