Introducción
Laravel ofrece una API muy completa para simular peticiones HTTP y verificar sus respuestas. Puedes reproducir las peticiones dentro de los tests sin necesidad de levantar un servidor HTTP real.get() envía una petición GET a la aplicación y assertStatus() valida el código HTTP de la respuesta.
Durante las pruebas el middleware CSRF se desactiva automáticamente. No hace falta desactivarlo de forma explícita.
Cómo crear peticiones
Dentro de los tests puedes enviar peticiones con los métodosget, post, put, patch y delete.
Estos métodos no realizan una petición real por la red: simulan la petición internamente en la aplicación.
El valor devuelto es una instancia de Illuminate\Testing\TestResponse, que expone muchos métodos de aserción.
Personalizar cabeceras
ConwithHeaders() puedes personalizar las cabeceras de la petición.
Cookies
Los métodoswithCookie() o withCookies() permiten definir cookies antes de la petición.
Sesión y autenticación
ConwithSession() puedes preparar los datos de sesión antes de la petición.
actingAs() envía la petición como un usuario autenticado. Se combina con las factorías de modelos.
actingAs(), se autenticará con ese guard. Además, ese guard pasa a ser el predeterminado durante la prueba.
actingAsGuest().
Depurar la respuesta
Cuando quieras inspeccionar el contenido de la respuesta durante un test, usadump, dumpHeaders o dumpSession.
dd, ddHeaders, ddBody, ddJson y ddSession.
Probar excepciones
Para comprobar que se lanza una excepción concreta, utiliza el facadeExceptions.
assertNotReported o assertNothingReported.
withoutExceptionHandling().
assertThrows().
assertDoesntThrow().
Pruebas de API JSON
Laravel ofrece muchos helpers para probar APIs JSON. Utiliza los métodosjson, getJson, postJson, putJson, patchJson, deleteJson y optionsJson.
assertJson() convierte la respuesta a array y comprueba que el array indicado esté contenido en la respuesta JSON. Aunque la respuesta contenga otras propiedades, la prueba pasa si aparece el fragmento indicado.Aserción de coincidencia exacta
ConassertExactJson() verificas que el JSON devuelto coincide exactamente con el array indicado.
Aserción por path JSON
ConassertJsonPath() verificas el valor en un path concreto.
Pruebas JSON fluidas
Pasando una closure aassertJson() puedes escribir aserciones fluidas mediante una instancia de AssertableJson.
has() y missing().
hasAll() y missingAll().
Aserciones sobre colecciones JSON
Cuando la ruta devuelve una respuesta con varios elementos,has() permite comprobar el número de elementos y el contenido de la colección.
each().
Aserción de tipos JSON
ConwhereType() y whereAllType() puedes validar el tipo de las propiedades.
|. La aserción pasa si el valor coincide con alguno.
string, integer, double, boolean, array y null.
Tests de autenticación
ConactingAs() puedes enviar peticiones como usuario autenticado.
Ejemplo: prueba del flujo de registro de usuarios
Ejemplo de test del endpoint de registro de usuarios.Pruebas de sesión
ConwithSession() puedes preparar la sesión antes de la petición.
Con assertSessionHas() compruebas la existencia de valores en la sesión.
Aserciones sobre la sesión
Pruebas de subida de archivos
El métodofake() de la clase Illuminate\Http\UploadedFile genera archivos e imágenes ficticios.
Combinado con Storage::fake() puedes probar la subida de archivos con facilidad.
assertMissing().
Personalizar el archivo ficticio
Puedes indicar el tamaño de la imagen y del archivo, útil para probar reglas de validación.Pruebas de vistas
Puedes probar vistas renderizándolas directamente sin simular la petición HTTP.view() acepta el nombre de la vista y, opcionalmente, un array de datos, y devuelve una instancia de Illuminate\Testing\TestView.
TestView expone los siguientes métodos de aserción.
Para obtener el HTML renderizado como cadena, castea la instancia
TestView.
withViewErrors().
Probar componentes
Conblade() puedes renderizar una plantilla Blade en bruto.
component() renderizas un componente Blade y obtienes una instancia de Illuminate\Testing\TestComponent.
Lista de aserciones sobre la respuesta
Métodos principales que ofrece la claseIlluminate\Testing\TestResponse.
Estado HTTP
Redirecciones
Contenido
JSON
Cabeceras y cookies
Vistas
Validación
Recomendaciones para hacer TDD
Empieza por tests de tipo Feature
Empieza por tests de tipo Feature
Los tests HTTP se sitúan en
tests/Feature/. Empezar por el comportamiento externo (petición → respuesta) deja claro qué funcionalidad debes implementar.Usa RefreshDatabase
Usa RefreshDatabase
En los tests que usen base de datos, aplica el trait
RefreshDatabase. La base de datos se reinicia tras cada prueba y se evitan interferencias entre tests, lo que permite construir una suite estable independiente del orden de ejecución.Aprovecha las factorías
Aprovecha las factorías
Con
User::factory()->create() y demás factorías es muy fácil crear datos de prueba. Definir estados (state) para casos concretos mejora mucho la legibilidad.Un test, una aserción
Un test, una aserción
Cada método de test debería verificar, en la medida de lo posible, una única cosa. Así resulta más fácil identificar la causa cuando falla. Aplicar el patrón AAA (Arrange, Act, Assert) hace los tests más legibles.
No olvides los tests de autenticación
No olvides los tests de autenticación
En las rutas que requieran autenticación, cubre siempre tanto el caso «autenticado» como el «no autenticado». Detectarás pronto problemas de seguridad.
Páginas relacionadas
Introducción a los tests
Repasa los fundamentos del testing en Laravel y el uso de
php artisan test.