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.
#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
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