我想为我的数据模型编写有意义且可行的测试
我一直在努力尝试test models like a boss in Laravel(现在我想说我正在努力保持中层管理职位)。我将Ardent
用于数据模型。上面引用的文章使Factory Muff
看起来超棒,并且在促进创建模拟对象方面非常方便。
但是,当我深入研究时,发现Factory Muff
可以提供的数据非常有限。它基本上只是随机的单词和电子邮件地址。除此之外,似乎我必须将静态方法写入我的数据模型中才能为模拟对象生成有效数据。这似乎不太有用,但是我想我可能是doing it wrong,完全误解了Factory Muff
的含义。
在数据模型中
考虑以下数据验证规则集:
public static $rules = [
'property' => 'required|address',
'name' => 'required|name',
'email' => 'required|email',
'phone' => 'required|phone',
'dob' => 'required|date',
];
Factory Muff
似乎完全不适合生成名称和电子邮件地址之外的任何此类数据,除非我想编写一个静态方法来生成以正确方式格式化的数据。这是我想与Factory Muff
有关的事情,以便能够创建模拟对象而不会出现验证错误:public static $factory = [
'property' => 'call|makeStreetAddress',
'name' => 'string',
'email' => 'email',
'phone' => 'call|makePhone',
'dob' => 'date|makeDate',
];
public static function makeStreetAddress()
{
$faker = \Faker\Factory::create();
return $faker->streetAddress;
}
public static function makePhone()
{
$faker = \Faker\Factory::create();
return $faker->phoneNumber;
}
public static function makeDate()
{
$faker = \Faker\Factory::create();
return $faker->date;
}
这似乎很冗长,尤其是在一个表上有10到20个字段时。我也不喜欢在每个静态方法调用中都调用
\Faker\Factory::create()
(我真的没有具体的原因,我只是不喜欢它;如果您知道一种解决方法,或者我的担心没有根据,请让我知道。)在数据库播种机中
我有database seeding scripts设置,该设置使用
Faker
在数据库中生成一堆垃圾以用于开发和测试。它超级直观且易于使用。例如,这是上述数据集的种子脚本。$faker = \Faker\Factory::create();
$application = Application::create([
'property' => $faker->streetAddress,
'name' => $faker->name,
'email' => $faker->email,
'phone' => $faker->phoneNumber,
'dob' => $faker->dateTimeBetween('-60 years', '-18 years'),
]);
我对自己在这里做的事情的思考越多,就越觉得自己变得多余。
问题
如果在运行测试之前使用
Faker
生成的垃圾数据为数据库播种,我是否甚至需要Factory Muff
创建模拟对象?我是否应该能够使用数据库中的种子数据来充分测试代码库?我为什么要嘲笑?我是否错过了
Faker Muff
的全部内容?有什么好处吗?在我看来,似乎只不过是一个随机单词生成器而已。我究竟做错了什么?我对TDD极为感兴趣,但它是如此艰巨。如果您发现我的代码中有任何不良做法或缺乏最佳做法,请告诉我。
最佳答案
我认为您在这里混淆了两个不同的概念。
首先,使用Faker
创建的数据(在本例中为数据库种子)的目的是模拟应用程序中的实际场景。例如,如果您正在开发博客平台,则可以使用它来制作一些带有标签,用户评论和作者评论的博客文章。
关于测试,您可以在功能测试或验收测试中使用它。例如,如果要测试test tag page shows posts tagged with X tag
或test user can only delete his own comments
之类的东西,则可以利用Faker
数据来使用一些以前的帖子,标签和注释。
另一方面,FactoryMuff
允许您快速创建任何给定模型的实例。在对Post
模型的验证方法进行单元测试时,请考虑这种情况,因此您必须:
// 1. create new Post
// 2. fill it with data
// 3. try to validate
在这里播种数据库将无济于事,因为您将要创建一个新模型,并且
FactoryMuff
将为您执行步骤1和2。另外,请记住,在进行单元测试时,您希望独立进行此操作,因此根本不需要接触数据库。相反,您可以模拟数据库对象并返回假模型及其可能的关系(再次将FactoryMuff
传递给救援人员)。最后,我认为也许您没有看到
FactoryMuff
功能的优势,因为您的应用程序可能仍然很小,但是随着您的代码库和测试的增长,您将也不会介意编写一些静态方法。关于validation - TDD与Laravel 4,Factory Muff,Ardent,Faker-我做错了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20555187/