模拟 / 工厂
Analogue ORM 的 Illuminate 数据库工厂实现
Requires
- php: >=7.0
- fzaninotto/faker: ~1.4
- illuminate/database: >=5.6.12
- illuminate/support: >=5.6.12
Requires (Dev)
- analogue/orm: 5.6.*
- fzaninotto/faker: ~1.4
- laravel/browser-kit-testing: ^1.0
- laravel/laravel: >=5.6.12
- phpunit/phpunit: ~6.0
README
此包为 Analogue 数据映射 ORM 添加了 Laravel 的 'Model Factory' 功能支持。
安装
将此行添加到您的 composer.json 文件中
composer require analogue/factory
配置
将服务提供者添加到 config/app.php
'Analogue\Factory\FactoryServiceProvider',
用法
Analogue Factory 使用与 Eloquent 相同的定义机制。默认情况下,此文件包含一个工厂定义,它随默认 Laravel 安装提供
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
在作为工厂定义的闭包中,您可能希望返回模型上所有属性的默认测试值。闭包将接收到 Faker PHP 库的实例,允许您方便地生成各种类型的随机数据以进行测试。
当然,您可以自由地向 ModelFactory.php 文件添加自己的附加工厂。
多种工厂类型
有时您可能希望为相同的 Analogue 实体类有多个工厂。例如,您可能除了普通用户外还想有一个 "管理员" 用户的工厂。您可以使用 defineAs 方法定义这些工厂
$factory->defineAs(App\User::class, 'admin', function ($faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => str_random(10),
'remember_token' => str_random(10),
'admin' => true,
];
});
您不需要从您的基用户工厂复制所有属性,可以使用 raw 方法获取基属性。一旦您有了属性,只需补充您需要的任何附加值即可
$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
$user = $factory->raw(App\User::class);
return array_merge($user, ['admin' => true]);
});
在测试中使用工厂
定义您的工厂后,您可以在测试或数据库种子文件中使用全局 analogue_factory 函数来生成模型实例。让我们看看创建模型的一些示例。首先,我们将使用 make 方法,该方法创建模型但不会将它们保存到数据库中
public function testDatabase()
{
$user = analogue_factory(App\User::class)->make();
// Use entity in tests...
}
如果您想覆盖实体的一些默认值,您可以将值数组传递给 make 方法。只有指定的值将被替换,其余值保持为工厂指定的默认值
$user = analogue_factory(App\User::class)->make([
'name' => 'Abigail',
]);
您还可以创建许多模型的集合或创建特定类型的模型
// Create three App\User instances...
$users = analogue_factory(App\User::class, 3)->make();
// Create an App\User "admin" instance...
$user = analogue_factory(App\User::class, 'admin')->make();
// Create three App\User "admin" instances...
$users = analogue_factory(App\User::class, 'admin', 3)->make();
持久化工厂实体
create 方法不仅创建模型实例,还使用 Analogue 的 Mapper store() 方法将它们保存到数据库中。
public function testDatabase()
{
$user = analogue_factory(App\User::class)->create();
// Use entity in tests...
}
同样,您可以通过将数组传递给 create 方法来覆盖模型上的属性
$user = analogue_factory(App\User::class)->create([
'name' => 'Abigail',
]);
构建复杂实体
通过递归调用 analogue_factory 函数,您可以非常容易地生成复杂实体
$factory->define(App\Post::class, function (Faker\Generator $faker) {
return [
'title' => $faker->sentence,
'content' => $faker->text,
];
});
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'posts' => analogue_factory(App\Post::class, 10),
];
});
您甚至可以用一个调用将复杂实体持久化
$users = analogue_factory(App\User::class, 3)->create();