使用工厂和确定性种子在Laravel中播种测试数据库



我有很多工厂使用faker生成模型,如文档中所建议的:

$factory->define(AppMember::class, function (Faker $faker) {
return [
'name' => $faker->name()
];
});

我想在测试中使用这些工厂,以便将数据库种子化为已知状态。当我调用factory(AppMember::class, 10)时,Faker(本质上(正在创建随机数据,这使得像$this->assertEquals('Eve', Member::find(5)->name)这样的断言在未来的运行中失败。

我注意到Faker有一个seed方法来允许确定性数据生成:

$faker = FakerFactory::create();
$faker->seed(1234);

但是,对于factory(AppMember::class, 10)接口,似乎无法设置工厂中使用的Faker实例的种子。

有没有办法从测试用例中设置Faker种子

否则,在测试中设置数据库状态的最佳实践是什么(我想使用工厂,但这可能不是最好的方法(

Faker与工厂一起使用,以便您能够快速创建模型实例,而不必自己在测试中提供所有数据。简单地做起来容易得多:

factory(User::class)->create();

而不是手动指定CCD_ 5模型所需的所有字段。Faker为工厂定义中指定的所有字段提供随机样本数据。

当你在测试中断言时,你不应该依赖于提前知道随机数据会是什么。您可以自己提供属性,这些属性被合并到工厂中定义的随机数据中,您可以使用这些数据来进行断言。

一个简单而琐碎的例子:

$user = factory(User::class)->create(['name' => 'Joe Bloggs']);
$this->assertEquals('Joe Bloggs', $user->name);

这样做的好处是,您只需要为测试提供您感兴趣的属性,就可以让您的工厂负责提供其余的数据。

当然,您可以允许您的工厂提供属性,然后在生成的模型中使用这些信息来检查数据库中的数据。类似这样的东西:

$user = factory(User::class)->create(['enabled' => false]);
$user->enableUser();
$this->seeInDatabase((new User)->getTable(), [
'id' => $user->id,
'name' => $user->name,
'enabled' => true
]);

在本例中,工厂用于创建用户,将enabled属性提供为false。您正在测试的方法,在本例中为enableUser。然后,您可以在seeInDatabasewhere部分中使用工厂生成的用户的ID和名称,以及'enabled' => true,通过将enabled字段设置为true但保持生成的name不变,来确保为生成的用户更新数据库。