Uso de Clases Mother en Pruebas con PHP Laravel - Greetik Soluciones - Consultoría TIC Extremadura
test, programación2025-03-14 11:59:01Greetik Soluciones SL

Uso de Clases Mother en Pruebas con PHP Laravel

Las pruebas en Laravel son esenciales para garantizar la estabilidad y fiabilidad del software. Una técnica avanzada para mejorar la calidad y mantenibilidad de las pruebas es el uso de clases Mother. Estas clases ayudan a simplificar la creación de objetos de prueba, permitiendo escribir tests más claros y reutilizables. En este artículo, exploraremos la importancia de las clases Mother y cómo implementarlas en PHP Laravel.

¿Qué son las Clases Mother?

Las clases Mother son una estrategia de diseño en pruebas que permiten generar instancias de objetos preconfigurados para facilitar la creación de datos en las pruebas. Funcionan como una capa intermedia entre los modelos de la aplicación y las pruebas, proporcionando métodos para instanciar objetos con valores por defecto que pueden ser modificados según las necesidades del test.

Ventajas de las Clases Mother

  1. Reutilización de Código: Evita la duplicación de lógica en la creación de datos de prueba.

  2. Claridad en los Tests: Reduce el ruido en las pruebas, haciendo que sean más legibles.

  3. Mantenimiento Simplificado: Permite modificar la estructura de los objetos de prueba en un solo lugar sin afectar múltiples pruebas.

Implementación de una Clase Mother en Laravel

Supongamos que tenemos un modelo User en Laravel. Normalmente, usaríamos factories para generar usuarios en pruebas, pero podemos complementar esto con una clase Mother para una mayor flexibilidad.

1. Definir la Clase Mother

Creamos una clase UserMother dentro de tests/Mothers:

namespace Tests\Mothers;

use App\Models\User;
use Illuminate\Support\Facades\Hash;

class UserMother
{
    public static function create(array $attributes = []): User
    {
        return User::factory()->create(array_merge([
            'name' => 'John Doe',
            'email' => 'johndoe@example.com',
            'password' => Hash::make('password123'),
        ], $attributes));
    }
}

 

2. Usar la Clase Mother en las Pruebas

En una prueba de inicio de sesión, en lugar de repetir la creación del usuario en cada test, utilizamos UserMother:

use Tests\Mothers\UserMother;
use Tests\TestCase;

class LoginTest extends TestCase
{
    public function test_user_can_login()
    {
        $user = UserMother::create(['email' => 'test@example.com']);

        $response = $this->post('/login', [
            'email' => 'test@example.com',
            'password' => 'password123',
        ]);

        $this->assertAuthenticatedAs($user);
        $response->assertRedirect('/dashboard');
    }
}

 

3. Extender la Clase Mother para Diferentes Casos

Podemos definir métodos adicionales para generar usuarios con roles específicos:

public static function admin(): User
{
    return self::create(['role' => 'admin']);
}

public static function guest(): User
{
    return self::create(['role' => 'guest']);
}

 

Esto permite escribir pruebas más limpias y expresivas:

public function test_admin_can_access_dashboard()
{
    $admin = UserMother::admin();
    $this->actingAs($admin);
    
    $response = $this->get('/admin/dashboard');
    $response->assertStatus(200);
}

 

Conclusión

Las clases Mother en Laravel facilitan la generación de datos de prueba de una manera organizada y reutilizable. Complementan las factories de Laravel al proporcionar una API clara para instanciar objetos en las pruebas. Implementarlas en tu flujo de trabajo mejorará la calidad y mantenibilidad de los tests, asegurando un software más robusto y libre de errores.

 

* artículo generado por chatgpt