我有这个工厂:
Factory.define :email_address do |e|
e.sequence(:address) { |n| "factory_#{n}@example.com" }
e.validated true
end
当我使用 运行我的规范时rake spec
,它工作正常。
当我运行 autospec 时,它立即失败,声称电子邮件地址在两个不同的对象中被使用了两次(有一个验证限制了这一点)。
为什么它在 autospec 下表现不同?
我有这个工厂:
Factory.define :email_address do |e|
e.sequence(:address) { |n| "factory_#{n}@example.com" }
e.validated true
end
当我使用 运行我的规范时rake spec
,它工作正常。
当我运行 autospec 时,它立即失败,声称电子邮件地址在两个不同的对象中被使用了两次(有一个验证限制了这一点)。
为什么它在 autospec 下表现不同?
有时,当您使用 Ctrl+C 中止测试套件时,可能会使您的数据库变脏。由于您的数据库很脏,因此创建新对象将产生验证冲突。再次运行rake db:test:clone
,您应该会没事的。
我怀疑正在发生的事情是 FactoryGirln
在每次调用时都会重置它autospec
,但数据库尚未清空。
首先,要检查此诊断,请将您的工厂更改为以下内容:
Factory.define :email_address do |e|
e.sequence(:address) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" }
e.validated true
end
如果我的诊断是正确的,有两种可能的解决方法:
Factory::Sequence
- 您可能必须Factory::Sequence.sequences
从 aHash[Symbol => Proc]
转到Hash[Symbol => [Proc, Integer]
记住它使用的最高索引的 a。事实上,这甚至可能不起作用,因为 autospec似乎确实正确地卸载了 FactoryGirl 类(否则序列查找不会失败并创建一个新Factory::Sequence
对象)。