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.
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.
Reutilización de Código: Evita la duplicación de lógica en la creación de datos de prueba.
Claridad en los Tests: Reduce el ruido en las pruebas, haciendo que sean más legibles.
Mantenimiento Simplificado: Permite modificar la estructura de los objetos de prueba en un solo lugar sin afectar múltiples pruebas.
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.
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));
}
}
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');
}
}
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:
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