2013-01-23 3 views
0

J'utilise MongoId dans mon application Rails, considérez que j'ai les champs ci-dessous dans une classe nommée « Post » avec en dessous de la structureComment charger les usines pour les modèles embarqués (MongoId - Rails)

class UserPost 

    include Mongoid::Document 
    field :post, type: String 
    field :user_id, type: Moped::BSON::ObjectId 
    embeds_many :comment, :class_name => "Comment" 

    validates_presence_of :post, :user_id 

end 

-

class Comment 

    include Mongoid::Document 
    field :commented_user_id, type: Moped::BSON::ObjectId 
    field :comment, type: String 

    embedded_in :user_post, :class_name => "UserPost" 

end 

Ce modèle fonctionne parfaitement lors de l'insertion de valeurs.

Mais maintenant je travaille sur l'écriture de test pour ce modèle, j'utilise Factory girl pour charger les données de test. Je suis confus avec la façon dont je peux tracer des champs de modèle pour "UserPost" modèle sous /spec/factories/user_posts.rb.

J'ai essayé avec le format ci-dessous, mais sa ne fonctionne pas (seulement certains champs sont ajoutés par exemple)

FactoryGirl.define do 

    factory :user_post do 
    id Moped::BSON::ObjectId("50ffd609253ff1bfb2000002") 
    post "Good day..!!" 
    user_id Moped::BSON::ObjectId("50ffd609253ff1bfb2000002") 
    comment :comment 
    end 

    factory :comment do 
    id Moped::BSON::ObjectId("50ffd609253ff1bfb2000002") 
    end 

end 
+0

Pourquoi inscrivez-vous des identifiants? – apneadiving

+0

son par exemple .. comment devrais-je définir l'usine sans codage en dur? – balanv

Répondre

0

Je pense que votre problème est la création d'objets avec les associations. Nous avons résolu ce problème en utilisant le bloc ignore pour créer des associations paresseusement.

FactoryGirl.define do 

    # User factory 
    factory :user do 
    # ... 
    end 

    # UserPost factory 
    factory :user_post do 

    # nothing in this block gets saved to DB 
    ignore do 
     user { create(:user) } # call User factory 
    end 

    post "Good day..!!" 

    # get id of user created earlier 
    user_id { user.id } 

    # create 2 comments for this post 
    comment { 2.times.collect { create(:comment) } } 
    end 
end 

# automatically creates a user for the post 
FactoryGirl.create(:user_post) 

# manually overrides user for the post 
user = FactoriGirl.create(:user) 
FactoryGirl.create(:user_post, user: user) 

Une solution ... Dans l'usine :user_post, vous devez créer un tableau de Comment objets pour UserPost.comment en raison de embeds_many. Pas seulement un seul.

Questions connexes