Factory Girl序列在autospec下失败

时间:2010-06-09 23:55:21

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

我有这个工厂:

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

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

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

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

2 个答案:

答案 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

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

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