En parcourant un didacticiel sur les tests de contrôleur, l'auteur donne un exemple de test rspec testant une action de contrôleur. Ma question est, pourquoi ont-ils utilisé la méthode attributes_for
sur build
? Il n'y a aucune explication claire pourquoi attributes_for
est utilisé en plus qu'il retourne un hachage de valeurs.
it "redirects to the home page upon save" do
post :create, contact: Factory.attributes_for(:contact)
response.should redirect_to root_url
end
Le lien du didacticiel se trouve ici: http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html L'exemple se trouve au début de la section de sujet Controller testing basics
attributes_for
renverra un hachage, tandis que build
renverra un objet non persistant.
Étant donné l'usine suivante:
FactoryGirl.define do
factory :user do
name 'John Doe'
end
end
Voici le résultat de build
:
FactoryGirl.build :user
=> #<User id: nil, name: "John Doe", created_at: nil, updated_at: nil>
et le résultat de attributes_for
FactoryGirl.attributes_for :user
=> {:name=>"John Doe"}
Je trouve attributes_for
très utile pour mon test fonctionnel, car je peux faire des choses comme ceci pour créer un utilisateur:
post :create, user: FactoryGirl.attributes_for(:user)
Lorsque vous utilisez build
, nous devons créer manuellement un hachage d'attributs à partir de l'instance user
et le transmettre à la méthode post
, comme:
u = FactoryGirl.build :user
post :create, user: u.attributes # This is actually different as it includes all the attributes, in that case updated_at & created_at
J'utilise généralement build
& create
lorsque je veux directement des objets et non un hachage d'attributs
Faites-moi savoir si vous avez besoin de plus de détails