Как определить вложенные фабрики с FactoryBot?

учитывая две модели, Alert и Zipcode, где одно предупреждение должно иметь 1 или более Zipcodes:

class Alert < ActiveRecord::Base
  attr_accessible :descr, :zipcode

  has_many :zipcode
  validates :zipcode, :length => { :minimum => 1 }
end

class Zipcode < ActiveRecord::Base
  attr_accessible :zip
  belongs_to :alert
end 

Как написать мои фабрики FactoryBot так, чтобы:

  • фабрики Zipcode определены в их собственном файле
  • фабрики оповещений определяются в собственном файле
  • Alert может полагаться на фабрику, определенную Zipcode?

вся документация и примеры, которые я читаю, ожидают, что вы определите содержащийся класс внутри Родительский заводской файл, blob их все вместе, или сделать какой-то другой компромисс или обойти. Разве нет чистого способа держать фабрики спецификаций отдельно?

1 ответов


трюк состоит в том, чтобы убедиться, что класс контейнера, то есть тот, у которого есть оператор has_many в его определении, создает содержащийся класс как массив в FactoryBot. Например:

в ваших спецификациях/фабриках/zipcodes.rb:

FactoryBot.define do
  factory :zipcode do
    zip { 78701 + rand(99) } 
  end
end

и в спецификации / фабриках / предупреждениях.rb:

FactoryBot.define do
  factory :alert do
    zipcode { Array.new(3) { FactoryBot.build(:zipcode) } }
  end
end