在factory_girl中重用关联

时间:2016-01-07 03:07:21

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

假设我有一个拥有公寓单元的应用程序。它还有设施和garage_types。还有一些地方。每个位置可能有不同的单位,设施和garage_types。所以我创建了以下工厂:

FactoryGirl.define do
  factory :unit do
    name '608'
    site
    garage_type
    amenity
  end

  factory :garage_type do
    name 'garage_type a'
    site
  end

  factory :amenity do
    name 'amenity one'
    site
  end

  factory :site do
    name            'Site One'
    phone           '5121234567'
  end
end

正如您所看到的,每个工厂都引用了一个站点。但是当创建单元时,它会创建它的关联站点,并创建garage_type和amenity,每个也创建一个站点。那么我如何让单位及其相关工厂都使用相同的网站而不是每个网站创建一个新网站?

2 个答案:

答案 0 :(得分:3)

您可以使用factorygirl callbacks

我不知道你的联想,所以这里有一个例子:

factory :unit do
    name '608'
    after(:build) {|unit| unit.sites = [FactoryGirl.create(:site)]}
end 

factory :site do
   name            'Site One'
   phone           '5121234567'
   after(:build) {|site| site.garage_types = [FactoryGirl.create(:garage_type)]}
end

如果您使用工厂创建unit,那么在构建unit之后,它将为新创建的site创建新的关联unit。然后,在创建site后,它将创建关联的garage_type

答案 1 :(得分:0)

这是你想要做的吗?

   site = FactoryGirl.create(:site)
   unit = FactoryGirl.create(:unit, site: site)
   garage_type = FactoryGirl.create(:garage_type, site: site)
   amenity = FactoryGirl.create(:amenity, site: site)