Заполнение связи с детьми в factory_girl

У меня есть модель Foo это has_many 'Панель'. У меня есть factory_girl фабрика для каждого из этих объектов. Фабрика для Панели имеет ассоциацию Foo; это инстанцирует Нечто, когда это создаст Панель.

Я хотел бы Фабрику, которая создает Нечто, которое содержит Панель. Идеально эта Панель была бы создана через: фабрика панели и уважение стратегия сборки (создают/создают) используемый для создания Нечто.

Я знаю, что мог просто звонить: фабрика панели и затем захватывает ссылку Foo от новой Панели. Я хотел бы избежать этого; в моем тестовом сценарии важным объектом является Foo; вызов фабрики Панели кажется немного окольным. Кроме того, я вижу потребность в Нечто с несколькими Панелями.

Действительно ли это возможно в factory_girl? Как Вы определяете эти отношения в родителе?

42
задан Craig Walker 30 May 2010 в 02:34
поделиться

2 ответа

Перехватчики 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 , и все довольны.

Я также создал абстрактную общеприменимую версию по этой сути , чтобы сохранить СУХИЕ вещи.

50
ответ дан 26 November 2019 в 23:52
поделиться

Вы можете использовать метод 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
4
ответ дан 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: