6 Stimmen

factory_girl Assoziationsprüfungen

Ich habe ein Problem, bei dem ich ein übergeordnetes Modell habe Foo die beide has_many :bars y has_many :bazes . Schließlich habe ich auch ein Verknüpfungsmodell BarBaz die belongs_to :bar y belongs_to :baz . Ich möchte alle bar_bazes validieren, so dass ihre bar und baz gehören beide zu den gleichen foo. Aber ich finde keinen Weg, um eine gültige Fabrik für dieses Modell zu definieren.

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

Ich erhalte einen ungültigen Datensatz Fehler, wenn ich versuche, die letztere zu erstellen, weil die bar und baz factory_girl versucht, es zu verknüpfen haben jeweils ihre eigenen foo. Bin ich aufgeschmissen?

5voto

tfwright Punkte 2744

Nachdem ich mir stundenlang den Kopf über dieses Problem zerbrochen habe, glaube ich, dass ich endlich eine Lösung gefunden habe. Es ist ziemlich verrückt, obwohl, so hoffentlich jemand anderes kann mir noch zeigen, wo ich bin dumm.

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

Das Hauptproblem ist, dass es ein foo in der Datenbank bereits Sie durch die Fabriken allein erhalten können, da Sie lokale Variablen oder beliebige Ruby-Code in factories.rb verwenden können (soweit ich sagen kann).

0voto

Luke Francl Punkte 30290

Die Verrücktheit, Fabriken mit tief verschachtelten Assoziationen zu erschaffen, hat mich dazu gebracht . mit dem Sie Testdatensätze mit ActiveRecord erstellen können. Es läuft während der db:test:prepare Schritt. Ich verwende ihn, um die Notwendigkeit von Vorrichtungen zu beseitigen. Sie können weiterhin Fabriken für einfacher zu erstellende Objekte verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X