1. Pruebas
  2. Pruebas de Consola

Introducción

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

Expectativas de Éxito / Fracaso

Para empezar, veamos cómo hacer afirmaciones sobre el código de salida de un comando Artisan. Para lograr esto, usaremos el método artisan para invocar un comando Artisan desde nuestra prueba. Luego, utilizaremos el método assertExitCode para afirmar que el comando se completó con un código de salida dado:

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

Puedes usar el método assertNotExitCode para afirmar que el comando no finalizó con un código de salida determinado:

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

Por supuesto, todos los comandos de terminal suelen salir con un código de estado de 0 cuando son exitosos y un código de salida distinto de cero cuando no lo son. Por lo tanto, por conveniencia, puedes utilizar las afirmaciones assertSuccessful y assertFailed para afirmar que un comando dado salió con un código de salida exitoso o no:

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

Expectativas de Entrada / Salida

Laravel te permite "simular" fácilmente la entrada del usuario para tus comandos de consola mediante el método expectsQuestion. Además, puedes especificar el código de salida y el texto que esperas que se emita por el comando de consola mediante los métodos assertExitCode y expectsOutput. Por ejemplo, considera el siguiente comando de consola:

Artisan::command('question', function () {
$name = $this->ask('¿Cuál es tu nombre?');
 
$language = $this->choice('¿Cuál es tu nombre?', [
'PHP',
'Ruby',
'Python',
]);
 
$this->line('Tu nombre es '.$name.' y prefieres '.$language.'.');
});

Puedes probar este comando con la siguiente prueba que utiliza los métodos expectsQuestion, expectsOutput, doesntExpectOutput, expectsOutputToContain, doesntExpectOutputToContain y assertExitCode:

/**
* Probar un comando de consola.
*/
public function test_console_command(): void
{
$this->artisan('question')
->expectsQuestion('¿Cuál es tu nombre?', 'Taylor Otwell')
->expectsQuestion('¿Qué idioma prefieres?', 'PHP')
->expectsOutput('Tu nombre es Taylor Otwell y prefieres PHP.')
->doesntExpectOutput('Tu nombre es Taylor Otwell y prefieres Ruby.')
->expectsOutputToContain('Taylor Otwell')
->doesntExpectOutputToContain('prefieres Ruby')
->assertExitCode(0);
}

Expectativas de Confirmación

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

$this->artisan('module:import')
->expectsConfirmation('¿Realmente deseas ejecutar este comando?', 'no')
->assertExitCode(1);

Expectativas de Tabla

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

$this->artisan('users:all')
->expectsTable([
'ID',
'Email',
], [
]);

Eventos de Consola

Por defecto, los eventos Illuminate\Console\Events\CommandStarting e Illuminate\Console\Events\CommandFinished no se desencadenan al ejecutar las pruebas de tu aplicación. Sin embargo, puedes habilitar estos eventos para una clase de prueba específica agregando el rasgo 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;
 
// ...
}