【问题标题】:TDD with Laravel 4, Factory Muff, Ardent, Faker - I'm doing it wrongLaravel 4、Factory Muff、Ardent、Faker 的 TDD - 我做错了
【发布时间】:2013-12-31 13:17:42
【问题描述】:

我想为我的数据模型编写有意义且有效的测试

我一直在尝试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'),
]);

我越想我在这里做什么,我就越觉得自己是多余的。

问题

  1. 如果我在运行测试之前使用Faker 生成的垃圾数据为数据库播种,我什至需要Factory Muff 来创建模拟对象吗?我不应该能够使用数据库中的种子数据充分测试代码库吗?为什么我需要模拟?
  2. 我错过了Faker Muff 的全部内容吗?它有什么优点吗?在我看来,它只不过是一个随机词生成器。
  3. 我做错了什么?我对 TDD 非常感兴趣,但它是如此令人生畏。如果您发现我的代码中有任何不良做法或缺少最佳做法,请告诉我。

【问题讨论】:

    标签: validation laravel-4 eloquent ardent


    【解决方案1】:

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

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

    在测试方面,您可以在功能测试或验收测试中使用它。例如,如果您想测试 test tag page shows posts tagged with X tag 或 test user can only delete his own comments 之类的东西,那么您可以利用 Faker 数据来处理一些以前的帖子、标签和 cmets。


    另一方面,FactoryMuff 允许您快速创建任何给定模型的实例。当您对 Post 模型的验证方法进行单元测试时,请考虑这种情况,因此您必须:

    // 1. create new Post
    // 2. fill it with data
    // 3. try to validate
    

    在这里为您的数据库播种将没有用处,因为您将要创建一个新模型,FactoryMuff 将为您执行第 1 步和第 2 步。另外,请记住,当您进行单元测试时,您希望单独进行,因此您根本不需要接触您的数据库。相反,您可以模拟您的数据库对象并返回假模型及其可能的关系(FactoryMuff 再次进行救援)。


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

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多