2013-01-21 5 views
3

J'utilise FactoryGirl et RSpec pour tester mon code. Mongoid dans mon ORM. Le problème que je rencontre est que pour créer un document incorporé, vous devez également créer le document parent. Voici un exemple:Comment créer des documents incorporés à l'aide de FactoryGirl?

# app/models/recipe.rb 
class Recipe 
    include Mongoid::Document 

    field :title 

    embeds_many :ingredients 
end 

# app/models/ingredient.rb 
class Ingredient 
    include Mongoid::Document 

    field :name 

    embedded_in :recipe 
end 

Alors je fais des usines pour ces deux:

# spec/factories/recipes.rb 
FactoryGirl.define do 
    factory :recipe do |f| 
    f.title "Grape Salad" 
    f.association :ingredient 
    end 
end 

# spec/factories/ingredients.rb 
FactoryGirl.define do 
    factory :ingredient do |f| 
    f.name "Grapes" 
    end 
end 

Le problème que j'ai maintenant que je ne peux jamais appeler FactoryGirl.create (: ingrédient). La raison étant que Ingredient est intégrée, et mon usine Ingredient ne déclare jamais l'association à la recette. Si je déclare une association à la recette, alors j'obtiens une boucle infinie parce que la recette s'associe à l'ingrédient, et l'ingrédient s'associe à la recette. C'est assez ennuyeux parce que je ne peux pas tester mon cours Ingredient correctement. Comment puis-je résoudre ce problème?

Répondre

4

Si votre objectif est simplement de test d'unité de la intégré de classe des ingrédients, il serait préférable d'éviter de faire un « créer » dans la base de données tout à fait, et instancier simplement l'aile du nez de l'objet ...

FactoryGirl.build(:ingredient) 

Cela éviterait de conserver l'objet dans MongoDB. Sinon, dans une perspective Mongoid/MongoDB, le document incorporé ne peut pas exister dans la base de données sans le parent, donc si vous devez persister l'objet dans la base de données, vous devrez le faire via le parent.

Questions connexes