13

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

factory :league do
  acronym 'NBA'
end

factory :division do
  league
end

分区属于联赛。当我定义这个工厂时,我假设将创建 1 个联赛,并且该联赛将被一遍又一遍地重用,以便为部门提供真正的联赛 ID。

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

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

导致以下测试中断

ActiveRecord::RecordInvalid:验证失败:首字母缩略词已被采用

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

如果我想要完成的工作比 factory_girl 更好,请提出建议

4

2 回答 2

7

initialize_with在您的联赛定义中使用。

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

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

于 2013-05-24T02:00:37.890 回答
4

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

编辑

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

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

  factory :league do
    acronym
  end
end

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

于 2013-05-24T02:00:19.780 回答