Je suis toujours un travail sur l'apprentissage RSpec donc je suis désolé si complètement oublié quelque chose ...modèles d'essai avec des relations et callbacks dans Rails avec RSpec et Factory_Girl
J'écris un test pour une recette a beaucoup d'ingrédients. Les ingrédients sont réellement ajoutés en pourcentage (avec une colonne% totale sur la formulation), donc je veux m'assurer que la colonne totale est mise à jour après chaque sauvegarde.
Donc maintenant mon test RSpec pour le modèle recipe_ingredient a quelque chose comme ceci:
it "should update recipe total percent" do
@recipe = Factory.create(:basic_recipe)
@ingredient.attributes = @valid_attributes.except(:recipe_id)
@ingredient.recipe_id = @recipe.id
@ingredient.percentage = 20
@ingredient.save!
@recipe.total_percentage.should == 20
end
J'ai une méthode after_save qui appelle simplement une mise à jour rapide sur l'ingrédient réception juste sauvé. C'est très simple:
EDIT: Cette action update_percentage est dans le modèle de recette. La méthode que j'appelle après avoir sauvegardé un ingrédient regarde juste sa recette, puis appelle cette méthode.
def update_percentage
self.update_attribute(:recipe.total_percentage, self.ingredients.calculate(:sum, :percentage))
end
Est-ce que je me trompe? Est-ce que je n'ai pas accès à l'objet parent lors de l'exécution des tests? J'ai essayé d'exécuter une méthode de base pour changer le nom de la recette parent après la sauvegarde, mais cela n'a pas fonctionné. Je suis sûr que c'est quelque chose dans la relation que j'ai oublié, mais toutes les relations sont configurées correctement.
Merci pour toute aide/conseil!
Désolé pour la méthode de confusion update_percentage est dans le modèle Recipe. La méthode after_save pour l'ingrédient charge la recette (@recipe = Recipe.find (self.recipe_id)), puis appelle le update_percentage dessus (@ recipe.update_percentage) Comment recharger la recette dans le test? – sshefer
Essayé "@ recipe.reload" dans le test et cela a fonctionné. Merci Ian, je n'avais pas réalisé que je devais faire ça! – sshefer