8
votes

Comment tester des attributs imbriqués dans les rails?

J'ai un contrôleur de rails, défini ici:

https: / /Github.com/abonec/simple-store/blob/master/app/Controls/carts_controller.rb

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: xxx

dans mon action de contrôleur Ces paramètres sont enregistrés comme ceci: xxx

mais je n'ai pas 't sais comment tester ce comportement dans un test. @ panier.Attributes ne génère que des attributs de modèle non imbriqués.

Comment puis-je tester ce comportement? Comment simuler la demande postale avec des attributs imbriqués dans mes tests fonctionnels?


0 commentaires

4 Réponses :


0
votes

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


1 commentaires

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.



2
votes

Utilisation de Test / unité Dans Rails3, générez d'abord un test d'intégration: xxx

dans le fichier généré que vous incluez votre test, quelque chose comme: xxx

J'espère que cela a aidé.


0 commentaires

3
votes

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


0 commentaires

8
votes

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 accepte_nedes_attributes_for code> dans votre modèle

Vous pouvez tester cela avec RSPEC comme ceci: p>

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


1 commentaires

Cart.update_attributes ne fonctionnera pas car il devrait être appelé sur une instance de panier non du panier lui-même.