проверки ассоциации фабрики-девушки - PullRequest
6 голосов
/ 13 января 2010

У меня проблема с родительской моделью Foo, в которой has_many :bars и has_many :bazes. Наконец, у меня также есть модель соединения BarBaz, которая belongs_to :bar и belongs_to :baz. Я хочу проверить все bar_bazes так, чтобы его bar и baz оба принадлежали одному и тому же foo. Но я не могу найти способ определить фабрику для этой модели, которая была бы действительной.

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

Я получаю ошибку неверной записи, когда пытаюсь создать последний, потому что bar и baz factory_girl пытаются связать его, каждый из которых имеет свой собственный foo. Я облажался?

Ответы [ 2 ]

5 голосов
/ 13 января 2010

Итак, после нескольких часов избиений головой об этой проблеме, я думаю, что наконец-то нашел решение. Хотя это довольно безумно, так что, надеюсь, кто-то еще сможет показать мне, где я глупый.

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 ​​в factories.rb (насколько я могу судить).

0 голосов
/ 15 января 2010

Безумие создания фабрик с глубоко вложенными ассоциациями привело меня к созданию fixie , которое позволит вам создавать тестовые записи, используя ActiveRecord. Он работает во время шага db:test:prepare. Я использую это, чтобы устранить необходимость в приспособлениях. Вы можете продолжать использовать фабрики для создания более простых объектов.

...