> Manuales > Manual de Testing en Laravel

Qué son los test de HTTP. Qué nos ofrece Laravel para realizar los test HTTP y probar que ante ciertas solicitudes las respuestas cumplen lo esperado.

HTTP Tests en Laravel

En los anteriores artículos de este manual hemos podido introducir la disciplina de test y realizar nuestras primeras pruebas en Laravel. Hemos mencionado que dentro de los tipos de test que puedes realizar, los que verifican funcionalidades se realizan con más frecuencia y nos permiten obtener mayor confianza en lo que respecta al funcionamiento correcto de la aplicación. Este tipo de tests son los test de Feature, en los cuales vamos a profundizar a continuación.

Dentro de los test de funcionalidades puedes encontrar test que se encargan de verificar el resultado de solicitudes HTTP, comandos de consola, usos determinados del navegador y otros. En este artículo vamos a ver algunas de las posibilidades de los tests de HTTP.

Veamos los puntos que vamos a abordar para explicar los HTTP Tests de Laravel.

Qué son los test de HTTP en Laravel

Este tipo de tests se usan para poder verificar ciertos comportamientos ante solicitudes HTTP determinadas, que pueden ser de distintos tipos, como por ejemplo solicitudes GET, POST, etc.

Una vez que se ejecuta el test de funcionalidad HTTP se pone en marcha el motor de Laravel para poder ejercitar esa solicitud, con lo que se ejecutará el código del enrutado, los controladores y toda la serie de artefactos de Laravel que participan en la creación de la respuesta ante tal solicitud.

Dentro de nuestros métodos de test entonces podremos realizar las comprobaciones que queramos sobre la respuesta. Por ejemplo, podemos comprobar que la respuesta ha dado un código HTTP (status code) determinado, que la respuesta contiene cierto contenido, que se ha generado alguna cabecera en particular, que se ha redirigido hacia otra ruta, que se ha producido un error particular y muchas otras cosas.

Así que, para producir un test de HTTP realizaremos un par de acciones:

Cómo producir una solicitud Get

Las solicitudes Get se realizan con el método get() de la clase base de funcionalidad de Laravel Tests\TestCase.

Tests\TestCase es la clase base que usamos para extender nuestras clases de prueba de tipo Feature.

Ese método nos devuelve la respuesta que generalmente guardaremos en una variable.

$response = $this->get('/');

El objeto $response es de la clase Illuminate\Testing\TestResponse que nos ofrece una gran variedad de aserciones que vamos a empezar a conocer en el siguiente punto.

Cómo realizar aserciones sobre la respuesta obtenida

Luego con la respuesta podemos realizar las aserciones que consideremos oportunas. En el anterior artículo ya vimos que podemos generar un request con una solicitud GET sobre la home para verificar el status code. Vamos a ampliar ese test para verificar otras cosas.

Por ejemplo, dada una aplicación limpia, la home del proyecto hace algunas explicaciones sobre lo que incluye este framework y usa algunas ocasiones la palabra "Laravel". Nosotros podemos verificar que esa palabra se encuentra en el contenido servido como respuesta.

Para ello podríamos crear un método de test como el que sigue:

#[Test]
public function the_home_page_contains_laravel(): void
{
    $response = $this->get('/');

    $response->assertSee('Laravel');
}

Como has podido apreciar, al hacer nuestra aserción hemos usado el propio $response que nos devolvió la solicitud get('/). Ese response nos ofrece muchos métodos de aserción. Uno de ellos es assertSee(), que verifica que una cadena se encuentra dentro de la respuesta recibida.

Incluso hay muchas variantes de este assertSee() con distintas especializaciones. como assertSeeInOrder() o assertSeeTextInOrder(), entre otras.

Podríamos testear otras cosas sencillas como que un texto no está presente, que se ha invocado una vista determinada, que se le ha enviado ciertos datos a la vista y mucho más.

Testeando valores en las cabeceras del HTTP de la respuesta

Otra de las aserciones que podemos realizar, además del contenido y el funcionamiento es que se encuentran presentes ciertas cabeceras de respuesta del HTTP con ciertos valores determinados.

Por ejemplo en el código siguiente vamos a verificar que la cabecera HTTP de la respuesta tiene el Content-Type esperado, que es 'text/html; charset=UTF-8'.

#[Test]
public function the_home_has_correct_contet_type_header(): void
{
    $response = $this->get('/');

    $response->assertHeader('Content-Type', 'text/html; charset=UTF-8');
}

Otras aserciones de la respuesta

Podemos verificar muchas otras cosas que podamos necesitar en nuestras aplicaciones. De hecho, Laravel es muy rico en este sentido.

Por ejemplo tenemos las aserciones de autenticación, que nos permiten saber si al acceder a cierta ruta hay un usuario autenticado o no, si el usuario que se ha autenticado es uno en concreto.

También tenemos métodos de verificar si las respuestas contienen errores de validación de los que genera el propio Laravel, por ejemplo flasheando los valores de los errores en la sesión.

Todos estos métodos de aserción los iremos viendo en ejemplos más adelante. De momento con esta introducción debemos haber adquirido una idea general de lo que son los HTTP Test en Laravel y estamos en disposición de estudiar ya funcionalidades concretas con mayor detalle.

En el próximo artículo mostraremos unos ejemplos más avanzados todavía, para explicar cómo se tienen que verificar las rutas que reciben datos de formulario.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual