我有很多工厂使用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
。然后,您可以在seeInDatabase
的where
部分中使用工厂生成的用户的ID和名称,以及'enabled' => true
,通过将enabled
字段设置为true
但保持生成的name
不变,来确保为生成的用户更新数据库。