J'ai un contrôleur de rails, défini ici:
https: / /Github.com/abonec/simple-store/blob/master/app/Controls/carts_controller.rb P>
sur le Panier Page Un utilisateur peut spécifier la quantité de ligne_Items en publiant des attributs imbriqués. Les paramètres ressemblent à ceci: p> dans mon action de contrôleur Ces paramètres sont enregistrés comme ceci: p> mais je n'ai pas 't sais comment tester ce comportement dans un test. Comment puis-je tester ce comportement? Comment simuler la demande postale avec des attributs imbriqués dans mes tests fonctionnels? P> p> @ panier.Attributes code> ne génère que des attributs de modèle non imbriqués. P>
4 Réponses :
Après avoir mis à jour le panier avec les attributs imbriqués, vous pouvez accéder aux attributs imbriqués en faisant
@cart.line_items
Comment accéder aux attributs imbriqués Je sais, mais je ne sais pas comment simuler la demande postale avec des attributs imbriqués dans mes tests fonctionnels.
Utilisation de dans le fichier généré que vous incluez votre test, quelque chose comme: p> J'espère que cela a aidé. P> p> Test / unité Code> Dans Rails3, générez d'abord un test d'intégration:
Assumer que vous utilisez Test :: Unité, et vous avez un panier dans @Cart dans la configuration, essayez quelque chose comme celui-ci dans votre test de mise à jour:
cart_attributes = @cart.attributes line_items_attributes = @cart.line_items.map(&:attributes) cart_attributes[:line_items] = line_items_attributes put :update, :id => @cart.to_param, :cart => cart_attributes
Un peu en retard à la fête, mais vous ne devriez pas tester ce comportement du contrôleur. Les attributs imbriqués sont un comportement modèle. Le contrôleur passe juste quelque chose au modèle. Dans votre exemple de contrôleur, aucun attribut imbriqué n'est mentionné. Vous souhaitez tester l'existence du comportement créé par Vous pouvez tester cela avec RSPEC comme ceci: p> accepte_nedes_attributes_for code> dans votre modèle
it "should accept nested attributes for units" do
expect {
Cart.update_attributes(:cart => {:line_items_attributes=>{'0'=>{'quantity'=>2, 'other_attr'=>"value"}})
}.to change { LineItems.count }.by(1)
end
Cart.update_attributes ne fonctionnera pas car il devrait être appelé sur une instance de panier non du panier lui-même.