4

我有这个工厂:

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

当我使用 运行我的规范时rake spec,它工作正常。

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

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

4

2 回答 2

3

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

于 2011-07-02T13:45:11.147 回答
1

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

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

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.sequences从 aHash[Symbol => Proc]转到Hash[Symbol => [Proc, Integer]记住它使用的最高索引的 a。事实上,这甚至可能不起作用,因为 autospec似乎确实正确地卸载了 FactoryGirl 类(否则序列查找不会失败并创建一个新Factory::Sequence对象)。
  2. 找出为什么在每次 autospec 运行之间没有清除您的数据库。你检查过你的拆卸方法吗?您的测试数据库是否支持事务?
于 2010-06-18T12:36:04.700 回答