29 votes

Remplir une association avec des enfants dans factory_girl

J'ai un modèle Foo que has_many 'Bar'. J'ai un factory_girl usine pour chacun de ces objets. L'usine de Bar a une association de Foo; il va instancier un Foo lorsqu'il crée le Bar.

J'aimerais une Usine qui crée un Toto qui contient un Bar. Idéalement, cette Barre serait créée par le :barre d'usine, et le respect de la stratégie de construction (créer/construire) utilisé pour créer le Foo.

Je sais que je pouvais l'appeler :la barre d'usine, puis saisir les Foo de référence de la nouvelle Barre. Je voudrais éviter cela; dans mon cas de test, l'objet principal est Toto qui en appelle à la Barre de l'usine semble un peu tortueux. Aussi, je peux voir le besoin pour un Foo avec plusieurs Bars.

Est-ce possible dans factory_girl? Comment définissez-vous cette relation à la mère?

37voto

Craig Walker Points 13478

De L'Usine.after_ crochets semblent être le seul moyen de le faire avec succès. J'ai trouvé un moyen de maintenir la stratégie de construction sans duplication de code:

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

La documentation stipule que after_build sera appelée avant after_create si l' :créer construire la stratégie est utilisée. Si :construire, à l'époque, seulement after_build est appelé, et tout le monde est heureux.

J'ai également créé une abstraction en général-version applicable à ce essentiel pour maintenir des choses SÈCHES.

4voto

Robert Speicher Points 8292

Vous pouvez utiliser la méthode association deux sens:

 Factory.define :foo do |f|
  # ...
  f.association :bar
end
 

Si cela ne fonctionne pas, vous pouvez les associer manuellement à l'aide d'un rappel. Voici un exemple d'une de mes applications:

 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
 

3voto

bjnord Points 964

FactoryGirl a maintenant une option :method => :build vous pouvez utiliser sur l'association, qui construira l'objet associé plutôt que de le créer.

# 64: Construire un objet crée des associations

3voto

mgp Points 61

FactoryGirl 4.3.0 appelle save! sur une association lors de l'appel de build sur l'objet parent, ce qui, à mon avis, n'est pas destiné à être le comportement correct.

Après avoir fouillé le code FactoryGirl, l'ajout de strategy: :build à la définition d'association dans l'usine semble maintenant créer mon association sans appeler save! .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X