【问题标题】:Factory Girl sequence fails under autospec工厂女孩序列在 autospec 下失败
【发布时间】:2010-06-09 23:55:20
【问题描述】:

我有这个工厂:

Factory.define :email_address do |e|
  e.sequence(:address) { |n| "factory_#{n}@example.com" }
  e.validated true
end

当我使用 rake spec 运行我的规范时,它运行良好。

当我运行 autospec 时,它立即失败,声称该电子邮件地址在两个不同的对象中被使用了两次(有一个验证限制了这一点)。

为什么它在 autospec 下表现不同?

【问题讨论】:

    标签: ruby-on-rails ruby testing rspec factory-bot


    【解决方案1】:

    有时,当您使用 Ctrl+C 中止测试套件时,可能会使您的数据库变脏。由于您的数据库很脏,因此创建新对象将产生验证冲突。再次运行rake db:test:clone 就可以了。

    【讨论】:

      【解决方案2】:

      我怀疑发生的事情是 FactoryGirl 在每次从 autospec 调用时都会重置 n,但数据库尚未清空。

      首先,要检查此诊断,请将您的工厂更改为以下内容:

      Factory.define :email_address do |e|
        e.sequence(:address) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" }
        e.validated true
      end
      

      如果我的诊断正确,有两种可能的解决方法:

      1. 将 FactoryGirl 更改为从大于使用的最大 ID 的索引开始。这将涉及对Factory::Sequence 进行一些严重的黑客攻击——您可能必须将Factory::Sequence.sequencesHash[Symbol => Proc] 转换为记住它使用的最高索引的Hash[Symbol => [Proc, Integer]。实际上,这甚至可能不起作用,因为 autospec 确实 似乎正确地卸载了 FactoryGirl 类(否则序列查找不会失败并创建一个新的 Factory::Sequence 对象)。
      2. 找出在每次运行 autospec 之间没有清除数据库的原因。你检查过你的拆卸方法吗?您的测试数据库是否支持事务?

      【讨论】:

      • 它又开始工作了。自从我写了这个问题以来,我已经升级了一堆 gem,我的代码库也发生了很大变化。我真的猜不出问题出在哪里。感谢您的输入!如果将来我有类似的问题,我将有一个故障排除的起点。和平约翰
      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多