我喜欢Faker,我一直在我的seeds.rb
中使用它来用真实的数据填充我的开发环境。
我也刚刚开始使用Factory Girl,这也节省了很多时间 - 但是当我在网络上搜索代码示例时,我没有看到很多人将两者结合起来的证据。
Q值。有没有一个很好的理由让人们不在工厂里使用faker?
我的感觉是,通过这样做,我会通过随机播种随机 - 但可预测的 - 数据来增加我的测试的稳健性,这有望增加错误弹出的可能性。
但也许这是不正确的,对工厂的硬编码没有任何好处,或者我没有看到潜在的陷阱。是否应该或不应该合并这两颗宝石有充分的理由吗?
答案 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时,我发现以下优点和缺点:
可能的缺点:
可能的优势: