在Rails中创建与FactoryBot / Factory Girl的关联

问题描述 投票:0回答:1

我有彼此关联的三个工厂: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

我将美国与纽约州和纽约州与布法罗联系起来吗?

ruby-on-rails rspec factory-bot
1个回答
0
投票

您可以将每个对象作为另一个工厂的属性传递。

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) } countrystate。除非您特别需要为测试创建对象,否则可能应该使用city并允许根据需要创建它们。

最后,我们可以通过反转来节省大量工作。创建城市,然后从城市中检索州,并从州中检索国家。

let

而不是指定确切的名称,您可以在测试中引用let(:city) { create(:city) } let(:state) { city.state } let(:country) { state.country } 。例如。

city.name
© www.soinside.com 2019 - 2024. All rights reserved.