相关工厂的工厂女孩​​唯一性验证失败

时间:2013-05-24 01:52:36

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

我有(简化)工厂定义如下:

factory :league do
  acronym 'NBA'
end

factory :division do
  league
end

分区属于联赛。当我定义这个工厂时,我的假设就是创建了一个联盟,并且这个联盟会一次又一次地被重复使用,以使分区成为真正的联盟。

相反,我在FactoryGirl.create(:division)的第二次调用时遇到错误,因为联盟acronym应该是唯一的。

class League < ActiveRecord::Base
  validates :acronym, uniqueness: true
end

导致测试中的以下中断

  

ActiveRecord :: RecordInvalid:验证失败:已经采用了缩略词

我如何解决这个问题,最好不要在测试设置中创建层次结构?

如果我想要实现的目标比factory_girl更好,请建议

2 个答案:

答案 0 :(得分:7)

在联盟定义中使用initialize_with

请参阅http://robots.thoughtbot.com/post/16196616388/factory-girl-2-5-gets-custom-constructors

然后您可以发出find_or_create_by_acronym以保证创建一次。

答案 1 :(得分:4)

根据您调用FactoryGirl.create的位置,将为您拥有的每个规范创建记录。您想要的是database_cleaner,一旦设置完毕,它将在每个规范之后清理您的数据库,确保您的验证错误不再是问题。

修改

糟糕,我误解了你的问题。您要做的是使用faker gem为每个首字母缩略词生成随机字符串或使用factory_girl这样的序列

FactoryGirl.define do
  sequence :acronym do |n|
    "NBA#{n}"
  end

  factory :league do
    acronym
  end
end

使用序列实际上会确保所创建的每个联赛都有一个独特的首字母缩略词。