Pruebas Unitarias en Laravel: Mutadores y Campos Virtuales

Clase 7 de 24Curso Básico de Testing con PHP y Laravel

Resumen

¿Cómo configurar pruebas unitarias en Laravel para aceptar inputs en minúscula?

En este ejercicio, exploraremos cómo realizar pruebas unitarias en Laravel, centrándonos en verificar que los nombres ingresados por los usuarios se guarden en minúscula. Este procedimiento es crucial para mantener la consistencia y limpieza de datos dentro de nuestras aplicaciones. Al adquirir estas habilidades, podrás mejorar significativamente la calidad del código y su mantenimiento.

Comencemos con la creación de una prueba unitaria para un modelo inexistente usando el comando make:test. A continuación, te mostramos los pasos a seguir:

php artisan make:test Models/PostTest

¿Cómo validar el set de nombres en minúscula?

Tras crear la estructura básica de pruebas, nuestro objetivo es comprobar que el sistema almacena los nombres en minúscula, independientemente de cómo se registren. Esto se logra configurando un test simple y efectivo. A continuación, iniciamos por crear un objeto Post y establecer un nombre en minúscula:

public function test_name_is_stored_in_lower_case()
{
    $post = new \App\Models\Post();
    $post->name = 'Proyecto en PHP';
    
    $this->assertEquals('proyecto en php', $post->name);
}

¿Qué ocurre al configurar el modelo para manejar inputs?

Dado que nuestro modelo Post aún no existe, debemos generarlo ejecutando el siguiente comando:

php artisan make:model Post

Luego, implementamos un mutador para el atributo name que lo convierte a minúsculas al guardarlo en la base de datos:

public function setNameAttribute($value)
{
    $this->attributes['name'] = strtolower($value);
}

Este mutador garantiza que cualquier nombre ingresado se normalice antes de almacenarse, facilitando búsquedas y comparaciones en los datos.

¿Cómo crear y validar un campo virtual?

Además de normalizar nombres, podremos crear y validar campos virtuales, como un slug, que tantas veces resulta útil en URLs y SEO. Configuraremos y probaremos esta funcionalidad:

¿Cómo generar un slug correctamente?

Creamos un test para asegurarnos que el campo virtual slug convierte el nombre a minúsculas y reemplaza los espacios por guiones:

public function test_slug_is_generated_correctly()
{
    $post = new \App\Models\Post(['name' => 'Proyecto en PHP']);
    
    $this->assertEquals('proyecto-en-php', $post->slug);
}

Incrementamos el modelo para retornar este slug cuando se solicite:

public function getSlugAttribute()
{
    return str_replace(' ', '-', strtolower($this->attributes['name']));
}

Este método permite obtener un slug, asegurándose de que el nombre del post adopta el formato esperado para su uso en la web.

¿Cómo asegurar la calidad del código?

Finalmente, es vital ejecutar las pruebas para corroborar que la implementación es correcta, utilizando el siguiente comando:

php artisan test

Si todos los tests pasan, sabremos que los campos se configuran y manipulan correctamente según lo esperado. Al integrar estas técnicas en tus proyectos, optimizarás tanto la eficiencia como la coherencia de los datos almacenados. Mantén siempre el hábito de validar cambios mediante pruebas, ya que sientan una base sólida para cualquier desarrollo.