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

Huw*_*Huw 8 ruby ruby-on-rails faker factory-bot

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

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

问:为什么人们不在工厂使用faker有充分的理由吗?

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

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

jro*_*ind 6

有些人反对它,就像这里一样.

不要使用随机属性值

一种常见的模式是使用假数据库(如Faker或Forgery)动态生成随机值.对于姓名,电子邮件地址或电话号码而言,这似乎很有吸引力,但它没有任何实际意义.使用序列创建唯一值非常简单:

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

  factory :post do
    title
  end 
end

FactoryGirl.create(:post).title # => 'Example title 1' 
Run Code Online (Sandbox Code Playgroud)

您的随机数据可能会在某个阶段触发测试中的意外结果,使您的工厂难以使用.任何可能以某种方式影响测试结果的值都必须被覆盖,这意味着:

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

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

但是如果你愿意的话,就没有什么可以阻止你这么做了.

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


coo*_*sse 5

由你决定。

我认为在测试中包含随机数据是一个非常好的主意,它总是帮助我发现我没有想到的错误和极端情况。

我从不后悔拥有随机数据。@jrochkind所描述的所有观点都是正确的(在阅读本答案之前,您应先阅读另一答案),但也可以(并且应该)将其写在您的书中spec_helper.rb

config.before(:all)  { Faker::Config.random = Random.new(config.seed) }
Run Code Online (Sandbox Code Playgroud)

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