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

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

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:validation失败:已经删除了缩略词

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

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

在联盟定义中使用initialize_with

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

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

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

编辑

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

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

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