Pruebas e insercción de registros en la base de datos con los model factories de Laravel

  • Publicado el 29 agosto, 2024
  • Palabras: 745

Los model factories de Laravel son una herramienta poderosa para generar datos falsos, lo que hace que las pruebas y la propagación de bases de datos sean eficientes y consistentes. Veamos cómo puedes aprovechar los model factories en tus aplicaciones de Laravel.

Pruebas e insercción de registros en la base de datos con los model factories de Laravel

#Definición básica de factory

 

Al probar su aplicación o cargar su base de datos, es posible que necesite insertar algunos registros en su base de datos. En lugar de especificar manualmente el valor de cada columna, Laravel te permite definir un conjunto de atributos predeterminados para cada uno de sus modelos mediante los model factories. Desde Laravel 8 en adelante, los factories se definen como clases:

 

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => bcrypt('password'),
            'remember_token' => Str::random(10),
        ];
    }
}

 

#Usando los factories en la pruebas automatizadas

 

En sus pruebas, puede crear instancias de modelo fácilmente:

 

public function test_user_can_create_post()
{
    $user = User::factory()->create();
    
    $response = $this->actingAs($user)->post('/posts', [
        'title' => 'My First Post',
        'content' => 'This is the content of my first post.',
    ]);

    $response->assertStatus(201);
}

 

#Creando múltiples modelos

 

¿Necesitas crear múltiples instancias? no hay problema:

 

$users = User::factory()->count(3)->create();

 

#Personalización de valores de atributos

 

Puedes personalizar atributos específicos:

 

$user = User::factory()->create([
    'name' => 'John Doe',
]);

 

#Factory States

 

Los states te permiten definir modificaciones discretas en tus factories:

 

class UserFactory extends Factory
{
    // ...

    public function admin()
    {
        return $this->state(function (array $attributes) {
            return [
                'role' => 'admin',
            ];
        });
    }
}

// Usage
$admin = User::factory()->admin()->create();

 

#Relationships

 

Los factories te facilitan la creación de modelos relacionados:

 

class PostFactory extends Factory
{
    public function definition()
    {
        return [
            'user_id' => User::factory(),
            'title' => $this->faker->sentence,
            'content' => $this->faker->paragraph,
        ];
    }
}

// Crea un usuario con tres publicaciones
$user = User::factory()
    ->has(Post::factory()->count(3))
    ->create();

 

#Insertar registros en la base de datos (Seeding the Database)

 

Los factories son geniales para insertar registro en tu base de datos:

 

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        User::factory()->count(50)->create();
        
        User::factory()
            ->count(10)
            ->has(Post::factory()->count(3))
            ->create();
    }
}

 

#Secuencias

 

Utilice secuencias cuando necesite recorrer una serie de valores:

 

$users = User::factory()
    ->count(10)
    ->sequence(fn ($sequence) => ['role' => $sequence->index % 2 ? 'user' : 'admin'])
    ->create();

 

#Callbacks después de inserciones/modificaciones

 

Puedes realizar acciones después de crear o actualizar un modelo:

 

User::factory()
    ->afterMaking(function (User $user) {
        // ...
    })
    ->afterCreating(function (User $user) {
        $user->profile()->create([...]);
    })
    ->create();

 

#Usar factories con datos reales

 

Los factories pueden ser útiles para rellenar campos con datos reales y al mismo tiempo completar los vacíos:

 

$realUser = [
    'name' => 'Jane Doe',
    'email' => 'jane@example.com',
];

$user = User::factory()->make($realUser);

 

Los model factories de Laravel ofrecen una forma flexible y potente de generar datos de prueba y de inicializar tu base de datos. Al aprovechar los factories, puede escribir pruebas más sólidas, configurar fácilmente escenarios de datos complejos y garantizar la coherencia en sus entornos de prueba y desarrollo.

Antonio Jenaro

Antonio Jenaro

Web Developer

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión