我正在尝试为Laravel中的Faker设置默认种子,通常以这种方式实现(不在Laravel中):
<?php
$faker = Faker\Factory::create();
$faker->seed(1234);
根据Faker的GitHub页面。
我试图这样做,这样我每次都可以获得相同的数据,这样我就可以编写一些单元测试,但我不知道如何在Laravel中做到这一点。我检查过Laravel的文档并尝试使用Google搜索,但我一无所获。
答案 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)
文件: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: