模拟/工厂

Analogue ORM 的 Illuminate 数据库工厂实现

v1.3.1 2018-03-15 13:27 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:53:42 UTC


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();