我有彼此关联的三个工厂:Country
类具有国家类,States
具有City
类。
countries.rb
FactoryBot.define do
factory :country do
name { Faker::Address.unique.country }
end
end
states.rb
FactoryBot.define do
factory :state do
association :country
name { Faker::Address.state }
end
end
cities.rb
FactoryBot.define do
factory :city do
association :state
name { Faker::Address.city }
end
end
在我的规范中,我想实例化特定的对象。
before(:each) do
create(:city, name:"Buffalo")
create(:state, name:"New York")
create(:country, name:"United States")
end
我将美国与纽约州和纽约州与布法罗联系起来吗?
您可以将每个对象作为另一个工厂的属性传递。
before(:each) do
country = create(:country, name:"United States")
state = create(:state, name:"New York", country: country)
create(:city, name:"Buffalo", state: state)
end
但是这使您无法访问这些测试对象。而是对每个对象使用let!
。
let!
现在您可以在示例中参考let!(:country) { create(:country, name:"United States") }
let!(:state) { create(:state, name:"New York", country: country) }
let!(:city) { create(:city, name:"Buffalo", state: state) }
,country
和state
。除非您特别需要为测试创建对象,否则可能应该使用city
并允许根据需要创建它们。
最后,我们可以通过反转来节省大量工作。创建城市,然后从城市中检索州,并从州中检索国家。
let
而不是指定确切的名称,您可以在测试中引用let(:city) { create(:city) }
let(:state) { city.state }
let(:country) { state.country }
。例如。
city.name