Documentación de Laravel 10.x
Aquí encontrarás fragmentos de código de Laravel y consejos útiles sobre desarrollo web.
Además de simplificar las pruebas HTTP, Laravel proporciona una API sencilla para probar los comandos de consola personalizados de tu aplicación.
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();
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);}
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);
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', ], [ ]);
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; // ...}