当您的工厂依赖另一个工厂时,您如何创建FactoryGirl工厂?

时间:2014-05-18 23:43:57

标签: ruby-on-rails factory-bot

我正在学习如何使用FactoryGirl。在我的hotel_spec.rb中,我已经取代了

before { @hotel = Hotel.new(name: "The Holiday Inn", rating: 3.0) }

let(:hotel) { FactoryGirl.create(:hotel) }

和我的规格/工厂/ hotels.rb

FactoryGirl.define do
    factory :hotel do |f|
        f.name "The Delano"
        f.rating 3.5
    end
end

所以我要通过并更换我的规范,我已经在工厂开始时手动创建了像我的@hotel对象这样的对象。

现在我需要更换以下内容......

room_spec.rb

before(:each) do
    @hotel = Hotel.create(name: "The Inn", rating: 5.0)
    @room = Room.new(hotel_id: @hotel.id, number: 101, smoking: false, rate: 99.99)
end

应该怎么做?我完全没有意识到语法,我只是在这里寻找语法。此外,它应该创建一个酒店工厂,然后将其传递到房间工厂,或者房间工厂只是在其内部创建一个酒店工厂并返回房间。如果它是前者或后者......我想要什么语法?

2 个答案:

答案 0 :(得分:1)

FactoryGirl.define do
  factory :room do
    hotel
  end
end

FactoryGirl会在您创建房间时自动为您创建酒店。如果您需要指定房间,可以通过FactoryGirl.create(:room, hotel: hotel)来完成。可以找到完整的文档here

答案 1 :(得分:0)

# Hotel factory

FactoryGirl.define do
    factory :hotel do
      name "The Delano"
      rating 3.5
    end
end

# Room Factory

FactoryGirl.define do
  factory :room do
    number rand 0..100
    smoking false
    # ...
    association :hotel
  end
end

这样,在制作Room时,FactoryGirl将使用HotelFactory创建一个酒店,并将房间与之关联。

此外,如果您的关联字段名称与类名称不匹配,则可以传递工厂名称:

FactoryGirl.define do
  factory :article do
    association :author, factory: :user
  end
end

这样,作者字段将由从UserFactory

创建的对象填充