У меня есть проблема, где у меня есть родительская модель Foo
, который оба has_many :bars
и has_many :bazes
. Наконец, у меня также есть модель соединения BarBaz
который belongs_to :bar
и belongs_to :baz
. Я хочу проверить весь bar_bazes так, чтобы его панель и baz оба принадлежали тому же нечто. Но я, может казаться, не выясняю способ определить фабрику для этой модели, которая была бы действительна.
Factory.define(:bar) do |bar|
bar.association(:foo)
end
Factory.define(:baz) do |baz|
bar.association(:foo)
end
Factory.define(:bar_baz) do |bar_baz|
baz_bar.association(:foo)
baz_bar.association(:bar)
baz_bar.association(:baz)
end
Я получаю недопустимую рекордную ошибку, когда я пытаюсь создать последнего, потому что панель и baz factory_girl пытаются связать ее, у каждого есть их собственное нечто. Я завинчен?
Так что после нескольких часов избиения головы против этой проблемы, я думаю, что у меня наконец-то есть решение. Это довольно безумно, хотя, надеюсь, кто-то еще может по-прежнему показать мне, где я глуп.
Factory.define :foo do |foo|
end
Factory.define :bar do |bar|
end
Factory.define :baz do |baz|
end
Factory.define :foo_with_baz do |foo|
foo.after_create { |foo| Factory(:baz, :foo => foo) }
end
Factory.define :bar_baz do |bar_baz|
bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz))
bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id }
end
Ключевой проблемой является то, что необходимо, чтобы быть Foo в базе данных, уже вы можете получить только через фабрики, поскольку вы можете использовать локальные переменные или произвольный код Ruby на факториях.
Несолюсность создания заводов с глубоко вложенными ассоциациями привела меня к созданию Fixie , которое позволяет создавать тестовые записи с использованием ActiveRecord. Он работает во время дБ: тест: готовьте
шаг. Я использую его, чтобы устранить необходимость в приборах. Вы можете продолжать использовать заводы для более упрощения объектов для создания.