У меня есть модель Foo
это has_many 'Панель'. У меня есть factory_girl фабрика для каждого из этих объектов. Фабрика для Панели имеет ассоциацию Foo; это инстанцирует Нечто, когда это создаст Панель.
Я хотел бы Фабрику, которая создает Нечто, которое содержит Панель. Идеально эта Панель была бы создана через: фабрика панели и уважение стратегия сборки (создают/создают) используемый для создания Нечто.
Я знаю, что мог просто звонить: фабрика панели и затем захватывает ссылку Foo от новой Панели. Я хотел бы избежать этого; в моем тестовом сценарии важным объектом является Foo; вызов фабрики Панели кажется немного окольным. Кроме того, я вижу потребность в Нечто с несколькими Панелями.
Действительно ли это возможно в factory_girl? Как Вы определяете эти отношения в родителе?
Перехватчики Factory.after_
кажутся единственным способом добиться успеха. Я нашел способ сохранить стратегию сборки без дублирования кода:
Factory.define :foo do |f|
f.name "A Foo"
f.after(:build) { |foo|
foo.bars << Factory.build(:bar, :foo => foo)
}
f.after(:create) { |foo|
foo.bars.each { |bar| bar.save! }
}
end
В документации указано, что after_build
будет вызываться перед after_create
, если : используется стратегия построения create
. Если используется : build
, то вызывается только after_build
, и все довольны.
Я также создал абстрактную общеприменимую версию по этой сути , чтобы сохранить СУХИЕ вещи.
Вы можете использовать метод association
обоими способами:
Factory.define :foo do |f|
# ...
f.association :bar
end
Если это не сработает, вы можете связать их вручную, используя обратный вызов. Вот пример из одного из моих приложений:
Factory.define :live_raid do |raid|
end
Factory.define :live_raid_with_attendee, :parent => :live_raid do |raid|
raid.after_create { |r| Factory(:live_attendee, :live_raid => r) }
end