我们应该在Rails工厂中使用Faker吗?

时间:2016-01-23 11:35:33

标签: ruby-on-rails ruby factory-bot faker

我喜欢Faker,我一直在我的seeds.rb中使用它来用真实的数据填充我的开发环境。

我也刚刚开始使用Factory Girl,这也节省了很多时间 - 但是当我在网络上搜索代码示例时,我没有看到很多人将两者结合起来的证据。

Q值。有没有一个很好的理由让人们不在工厂里使用faker?

我的感觉是,通过这样做,我会通过随机播种随机 - 但可预测的 - 数据来增加我的测试的稳健性,这有望增加错误弹出的可能性。

但也许这是不正确的,对工厂的硬编码没有任何好处,或者我没有看到潜在的陷阱。是否应该或不应该合并这两颗宝石有充分的理由吗?

3 个答案:

答案 0 :(得分:5)

有些人反对它,here

  

不要使用随机属性值

     

一种常见的模式是使用假数据库(如Faker或Forgery)来生成随机值   苍蝇对于姓名,电子邮件地址或   电话号码,但它没有任何实际意义。创造独特   值很简单,有序列:

FactoryGirl.define do   
  sequence(:title) { |n| "Example title #{n}" }

  factory :post do
    title
  end 
end

FactoryGirl.create(:post).title # => 'Example title 1' 
     

你的随机化   数据可能在某个阶段触发测试中的意外结果,   让你的工厂感到沮丧。任何可能的价值   以某种方式影响你的测试结果将不得不被覆盖,   意思是:

     

随着时间的推移,您将发现导致测试的新属性   有时失败。这是一个令人沮丧的过程,因为测试可能会失败   每十次或一百次只运行一次 - 取决于多少次   属性和可能的​​值有哪些,以及哪些组合   触发了这个bug。您必须列出每个这样的随机属性   每次测试都要覆盖它,这很愚蠢。所以,你创建非随机   工厂,从而否定原始随机性的任何好处。   有人可能会说,正如Henrik Nyh所做的那样,随机值可以帮助你   发现错误。虽然可能,但这显然意味着你有更大的   问题:测试套件中的漏洞。在最糟糕的情况下,错误   仍未被发现;在最好的情况下,你会得到一个神秘的   错误消息在下次运行测试时消失   很难调试。没错,一个神秘的错误比没有错误更好,但是   随机工厂仍然是适当单元测试的不良替代品,   代码审查和TDD以防止这些问题。

     

因此,随机工厂不仅值得付出努力   甚至会让你对你的测试产生虚假的信心,这比你的测试更糟糕   完全没有测试。

但是如果你愿意的话,没有什么能阻止你做这件事。

哦,有一种更简单的方法可以在最近的FactoryGirl中内联一个序列,该引用是为旧版本编写的。

答案 1 :(得分:4)

取决于你。

在我看来,在测试中随机数据是一个非常好的主意,它总是帮助我发现我没有想到的错误和角落案例。

我从不后悔随机数据。 @jrochkind描述的所有要点都是正确的(你应该在读这篇文章之前阅读另一个答案),但你也可以(而且应该)在spec_helper.rb

中写出这一点。
config.before(:all)  { Faker::Config.random = Random.new(config.seed) }

这将使您可以使用可重复的数据进行可重复的测试。如果你不这样做,那么你就会遇到另一个答案中描述的所有问题。

答案 2 :(得分:2)

我喜欢使用Faker,并且通常在使用更大的代码库时这样做。使用Faker with Factory Girl时,我发现以下优点和缺点:

可能的缺点:

  • 更难以重现完全相同的测试场景(至少RSpec通过每次显示随机数生成器种子来解决此问题,并允许您使用它重现完全相同的测试)
  • 生成数据浪费了一点性能

可能的优势:

  • 使数据显示通常更易于理解。在手动创建测试数据时,人们倾向于采用各种捷径来避免繁琐。
  • 同时使用Faker为测试构建工厂,为您提供了为演示文稿生成漂亮演示数据的方法。
  • 您可以在运行测试时随机发现边缘案例错误