我有这个工厂:
Factory.define :email_address do |e|
e.sequence(:address) { |n| "factory_#{n}@example.com" }
e.validated true
end
当我使用rake spec
运行我的规格时,它运行正常。
当我运行autospec时,它立即失败,声称电子邮件地址在两个不同的对象中被使用了两次(有一个限制这个的验证)。
为什么它在autospec下表现不同?
答案 0 :(得分:3)
有时,当您使用Ctrl + C中止测试套件时,可能会使数据库变脏。由于您的数据库很脏,因此创建新对象会产生验证冲突。只需再次运行rake db:test:clone
就可以了。
答案 1 :(得分:1)
我怀疑发生的事情是FactoryGirl在n
的每次调用中重置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
从Hash[Symbol => Proc]
转换为Hash[Symbol => [Proc, Integer]
,以便记住它使用的最高索引。实际上,这可能甚至不起作用,因为autospec 似乎正在正确卸载FactoryGirl类(否则序列查找不会失败并创建新的Factory::Sequence
对象)。