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
il serait bon de voir l'intégralité de votre rspec code pour cela, plutôt que de simplement le talon pour les nouveaux. Je trouve souvent que j'oublie d'éteindre tous le modèle de comportement (puisque nous sommes juste de tester si le contrôleur fonctionne correctement étant donné que le modèle est supposé fonctionner correctement).
J'ai ajouté plus de détails. C'est le seul exemple qui échoue.

OriginalL'auteur recursive_acronym | 2011-05-16