Validation 带Laravel 4的TDD,工厂套筒,Ardent,Faker-I';我做错了 我想为我的数据模型编写有意义且有效的测试

Validation 带Laravel 4的TDD,工厂套筒,Ardent,Faker-I';我做错了 我想为我的数据模型编写有意义且有效的测试,validation,laravel-4,eloquent,ardent,Validation,Laravel 4,Eloquent,Ardent,我一直在努力(现在我要说的是,我正在努力保住中层管理层的职位)。我使用的是我的数据模型。上面引用的文章使它看起来非常棒,并且在促进模拟对象的创建方面非常方便 然而,随着我深入挖掘,我发现Factory Muff所能提供的数据非常有限。基本上只是随机的单词和电子邮件地址。除此之外,我似乎必须在数据模型中写入一个静态方法,以生成模拟对象的有效数据。这似乎不是很有用,但我猜我可能完全误解了Factory Muff的意义 在数据模型中 考虑以下数据验证规则集: public static $rules

我一直在努力(现在我要说的是,我正在努力保住中层管理层的职位)。我使用的是我的数据模型。上面引用的文章使它看起来非常棒,并且在促进模拟对象的创建方面非常方便

然而,随着我深入挖掘,我发现
Factory Muff
所能提供的数据非常有限。基本上只是随机的单词和电子邮件地址。除此之外,我似乎必须在数据模型中写入一个静态方法,以生成模拟对象的有效数据。这似乎不是很有用,但我猜我可能完全误解了
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()
(我真的没有具体的原因,我只是不喜欢它;如果您知道解决方法,或者如果我的担心是没有根据的,请告诉我。)

在数据库播种器中 我有一个设置,用于在数据库中生成一堆垃圾,用于开发和测试。它非常直观,易于使用。例如,这是上述数据集的种子脚本

$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
    来创建模拟对象?难道我不能使用数据库中的种子数据充分测试代码库吗?为什么我需要嘲笑
  • 我是不是错过了《冒牌货蒙夫》的全部要点?它有什么好处吗?在我看来,它只不过是一个随机的单词生成器
  • 我做错了什么?我对TDD非常感兴趣,但它让人望而生畏。如果您注意到我的代码中有任何不好的实践,或者缺少最佳实践,请告诉我

  • 我认为你在这里混淆了两个不同的概念

    首先,您使用
    Faker
    创建的数据(在您的例子中是数据库种子)的目的是模拟应用程序中的真实场景。例如,如果你正在开发一个博客平台,你可以用它来发布一些带有标签、用户评论和作者评论的博客文章

    当涉及到测试时,您可以在功能测试或验收测试中使用它。例如,如果您想测试类似于
    测试标签页显示带有X标签的帖子
    测试用户只能删除自己的评论
    ,那么您可以利用
    伪造者
    数据来处理一些以前的帖子、标签和评论


    另一方面,
    FactoryMuff
    允许您快速创建任何给定模型的实例。考虑当您在单元测试您的代码> POST 模型的验证方法时的场景,所以您必须:

    // 1. create new Post
    // 2. fill it with data
    // 3. try to validate
    
    在这里,为数据库设定种子是没有用的,因为您将要创建一个新模型,
    FactoryMuff
    将为您执行步骤1和2。另外,请记住,当您进行单元测试时,您希望独立地进行测试,因此您根本不需要接触数据库。相反,您可以模拟您的数据库对象,并返回假模型及其可能的关系(
    FactoryMuff


    最后,我认为您可能没有看到
    FactoryMuff
    功能的优势,因为您的应用程序可能仍然很小,但随着代码库和测试的增长,您会并且不会介意编写一些静态方法