문제

부모 모델이있는 문제가 있습니다. Foo, 둘 다 has_many :bars 그리고 has_many :bazes. 마지막으로 조인 모델도 있습니다 BarBaz 어느 belongs_to :bar 그리고 belongs_to :baz. 바와 바즈가 모두 같은 foo에 속하도록 모든 bar_bazes를 검증하고 싶습니다. 그러나 유효한이 모델의 공장을 정의하는 방법을 찾을 수없는 것 같습니다.

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를 가지고 있기 때문에 후자를 만들려고 할 때 유효하지 않은 레코드 오류가 발생합니다. 내가 망쳐 졌어?

도움이 되었습니까?

해결책

이 문제에 대해 몇 시간 동안 머리를 때린 후 마침내 해결책이 있다고 생각합니다. 그래도 꽤 미쳤으므로 다른 사람이 내가 어리석은 곳을 보여줄 수 있기를 바랍니다.

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가 필요하다는 것입니다. 공장에서만 공장을 통해 얻을 수 있습니다. 로컬 변수 또는 공장에서 임의의 루비 코드를 사용할 수 있기 때문입니다.

다른 팁

깊이 중첩 된 연관성을 가진 공장을 만드는 데있어서 고정 activeRecord를 사용하여 테스트 레코드를 만들 수 있습니다. 그것은 동안 실행됩니다 db:test:prepare 단계. 나는 그것을 사용하여 비품의 필요성을 제거합니다. 건축하기 쉬운 물건을 위해 공장을 계속 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top