我正在学习如何使用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
应该怎么做?我完全没有意识到语法,我只是在这里寻找语法。此外,它应该创建一个酒店工厂,然后将其传递到房间工厂,或者房间工厂只是在其内部创建一个酒店工厂并返回房间。如果它是前者或后者......我想要什么语法?
答案 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