我有(简化)工厂定义如下:
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更好,请建议
答案 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
使用序列实际上会确保所创建的每个联赛都有一个独特的首字母缩略词。