Testing
Entity Factories
When testing or demonstrating your application you may need to insert some dummy data into the database. To help with this Laravel Doctrine provides Entity Factories, which are similar to Laravel's Model Factories. These allow you to define values for each property of your Entities and quickly generate many of them.
Place your Factory files in database/factories
. Each file in this directory will be run with the variable $factory
being an instance of LaravelDoctrine\ORM\Testing\Factory
.
Entity Definitions
To define an Entity simple pass the factory its classname and a callback which details what its properties should be set to
$factory->define(App\Entities\User::class, function(Faker\Generator $faker) {
return [
'name' => $faker->name,
'emailAddress' => $faker->email
];
});
Faker allows you to get Entities with different values each time you generate one. Note that as usual with Doctrine, we reference class property names, and not database columns!
The factory allows you to define multiple types of the same Entity using defineAs
$factory->defineAs(App\Entities\User::class, 'admin', function(Faker\Generator $faker) {
return [
'name' => $faker->name,
'emailAddress' => $faker->email,
'isAdmin' => true
];
});
Using Entity Factories in Seeds and Tests
After you have defined your Entities you can then use the factory to generate them or insert them directly into the database.
A helper named entity()
is defined to aid you in this or you can use the factory directly.
To make an instance of an Entity (but not persist it to the database), call
entity(App\Entities\User::class)->make();
// OR
$factory->of(App\Entities\User::class)->make();
If you need an Entity of a specific type (see the 'admin' example above)
entity(App\Entities\User::class, 'admin')->make();
// OR
$factory->of(App\Entities\User::class, 'admin')->make();
If you need multiple Entities
entity(App\Entities\User::class, 2)->make();
entity(App\Entities\User::class, 'admin', 2)->make();
// OR
$factory->of(App\Entities\User::class)->times(2)->make();
These methods will return an instance of Illuminate\Support\Collection
containing your Entities.
If you want to instead persist the Entity before being given an instance of it, replace calls to ->make()
with ->create()
,
e.g:
entity(App\Entities\User::class)->create(); // The User is now in the database
Passing Extra Attributes to Factories
Factory definition callbacks may receive an optional second argument of attributes.
$factory->define(App\Entities\User::class, function(Faker\Generator $faker, array $attributes) {
return [
'name' => isset($attributes['name']) ? $attributes['name'] : $faker->name,
'emailAddress' => $faker->email
];
});
$user = entity(App\Entities\User::class)->make(['name' => 'Taylor']);
// $user->getName() = 'Taylor'