围绕已存在的值编写工厂

时间:2011-11-07 21:34:11

标签: ruby-on-rails factory-bot

当我想测试一个想法时,我一直在使用Factory Girl来开发一些基本对象,我经常遇到这个问题:

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Login has already been taken

如果我在开发模式下运行FactoryGirl.create :user并将该用户留在数据库中,如果我在关闭控制台后尝试再次执行此操作,则必须运行该命令两次。基本上,序列在控制台实例之间重置。

有没有人想出办法写工厂,以便每次都能产生独特的结果?我知道我可以使用随机生成器从大域中选择一个值,从而最大限度地减少发生碰撞的可能性。如果可以的话,我想找一个更干净的方法。

1 个答案:

答案 0 :(得分:1)

您可以为此编写序列。

Factory.sequence(:email) do |n|
  "tester#{n}@example.com"
end

Factory.define :user do |f|
  f.name "Tester"
  f.email {Factory.next :email}
  f.password "tester"
end

来源:about half way down the page.

修改

重新阅读后,您似乎正在尝试以开发模式创建数据。

您应该使用seeds.rb文件并维护一个计数器。

index = User.count || 1

User.create([
  {:email => "user#{index++}@example.com",
   :password => "password"},
  {:email => "user#{index++}@example.com",
   :password => "password"}
])