Ce qui se passe ici: rspec stub(:nouvelle).avec...?
Je suis un peu confus au sujet de ce qui se passe sur l'échafaud contrôleur spécifications que rspec génère. Il semblait faire sens jusqu'à ce que j'ai ajouté l'autorisation de mon application et j'ai besoin maintenant de mettre à jour mes tests.
MyClass.stub(:new).with('these' => 'params') { mock_my_class(:save => true) }
Dans mon contrôleur je de fusion d'un hachage dans les paramètres lors de la création d'un nouvel enregistrement (il a besoin de l'current_user d'identité en cours de validité). MyClass.nouveau(params[:my_class].de fusion(:user_id => current_user.id))
Test Échoue
expected: ({"these"=>"params"})
got: ({"these"=>"params", "user_id"=>315})
Il est logique que le test échoue parce que la nouvelle méthode reçoit params il ne s'attendait pas. Il s'attendait à recevoir {'ces' => 'params'}, mais il en a reçu {'ces' => 'params', 'user_id' => 1234}
Donc ma réaction naturelle est d'ajuster le test parce que la nouvelle méthode devrait recevoir {'ces' => 'params', 'user_id' => 1234} et revenir à l'objet fantaisie.
J'ai donc ajouter à l'essai, comme suit:
MyClass.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_my_class(:save => true) }
C'est là que je l'obtenir jeté par une boucle. La sortie du test est le suivant:
expected: ({"these"=>"params", "user_id"=>298})
got: ({"these"=>"params"})
Il me semble que si un test réussi est magiquement se soustraire à moi. Je suis sûr qu'il ya une explication logique à ces résultats, mais je n'arrive pas à les comprendre.
De l'aide? 🙂
remarque:
Rspec site dit ce qui suit:
Account.should_receive(:find).with("37").and_return(account)
ou
Account.stub!(:find).and_return(account)
C'est assez facile à suivre, il semble juste bizarre l'échafaudage généré ne contient pas ces méthodes (à moins que j'ai manqué quelque chose qui est possible (: )
Passe
login_admin
describe "with valid params" do
it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
ForumSubTopic.stub(:new) { mock_forum_sub_topic(:save => true) }
ForumSubTopic.should_receive(:new).with({"these"=>"params", "user_id"=> @admin.id}) #PASS!
post :create, :forum_sub_topic => {'these' => 'params'}
assigns(:forum_sub_topic).should be(mock_forum_sub_topic) #PASS!
end
end
Échoue
login_admin
describe "with valid params" do
it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
ForumSubTopic.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_forum_sub_topic(:save => true) }
post :create, :forum_sub_topic => {'these' => 'params'}
assigns(:forum_sub_topic).should be(mock_forum_sub_topic)
end
end
J'ai ajouté plus de détails. C'est le seul exemple qui échoue.
OriginalL'auteur recursive_acronym | 2011-05-16
Vous devez vous connecter pour publier un commentaire.
"Ne faites jamais confiance à un junkie", comme le dit le dicton. On pourrait aussi dire, "ne faites jamais confiance à un échafaudage".
OK, c'est être un peu trop sévère. L'échafaudage fait de son mieux pour comprendre quels sont les paramètres de travail pour les modèles/contrôleurs de la production, mais il ne le sait pas imbriquée ressources (qui est ce que je suppose que vous utilisez), afin de ne pas générer le
user_id
dans les params de hachage. Ajouter que:La
these_params
clé est générée comme un exemple — de le supprimer et d'ajouter des paramètres sont nécessaires pour le contrôleur de créer unMyClass
.Concernant la
with
option:stub
etshould_receive
ne écraser les messages qui répondent aux conditions spécifiées, c'est à dire si vous n':Puis MyClass devra répondre à toutes les
new
message avec la maquette. Si, d'autre part, vous n':Puis MyClass ne répondra
new
quand il reçoit également{:bogus=>37}
comme un argument.OriginalL'auteur zetetic