Laravel模型工厂使用相同的种子进行测试

时间:2017-09-29 16:53:56

标签: php laravel unit-testing faker

我正在尝试为Laravel中的Faker设置默认种子,通常以这种方式实现(不在Laravel中):

<?php
$faker = Faker\Factory::create();
$faker->seed(1234);

根据Faker的GitHub页面。

我试图这样做,这样我每次都可以获得相同的数据,这样我就可以编写一些单元测试,但我不知道如何在Laravel中做到这一点。我检查过Laravel的文档并尝试使用Google搜索,但我一无所获。

2 个答案:

答案 0 :(得分:2)

以下是如何将种子应用于Laravel 5中的Faker。

app/database/factories目录中,创建一个新文件。我打电话给我SeedFactory.php

<?php

$factory->faker->seed('1');

就是这样!

现在您的单元测试具有一致的随机数据!

NB:如果您只有一个或两个工厂,则可以将该行附加到现有工厂文件。

这就是它起作用的原因。

当Laravel处理app/database/factories目录中的所有文件时,它会立即执行它们。传递的$factory对象是Illuminate\Database\Eloquent\Factory.php的一个实例,它保留了它自己的内部Faker\Generator实例。

此外,您不必担心文件或执行顺序的命名,因为这会在任何工厂回调之前被触发(假设您按照指示in the Laravel docs执行了此操作)。

答案 1 :(得分:0)

很容易。只需定义一个工厂。我们来看看出厂的默认工厂 与laravel 5.5

文件:database / factories / ModelFacotry.php

<?php

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| Here you may define all of your model factories. Model factories give
| you a convenient way to create models for testing and seeding your
| database. Just tell the factory how a default model should look.
|
*/

/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    // Add this line to original factory shipped with laravel.
    $faker->seed(123);

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

然后使用修补程序对其进行测试:

yudu@YududeMacBook-Pro ~/demo> php artisan tinker
Psy Shell v0.8.1 (PHP 7.1.8 — cli) by Justin Hileman
>>> $user = factory(App\User::class)->make()
=> App\User {#880
    name: "Jessy Doyle",
    email: "jalen86@example.net",
}
>>> $user = factory(App\User::class)->make()
=> App\User {#882
    name: "Jessy Doyle",
    email: "lbode@example.org",
}

Laravel Docs:

how to define and use factory

Seeding

相关问题