2010-07-28 6 views
1

J'ai récemment ajouté Devise à ma première application Rails3, et j'ai un peu de mal avec les tests du contrôleur.Test de deux attentes différentes avec moquer

Je suis en train de tester la classe de contrôleur User, qui est le même modèle que Devise. Donc, au début de mon spec j'ai ceci:

before(:each) do 
    sign_in @user = Factory.create(:user) 
end 

Maintenant, je peux obtenir le passage de test sans utiliser moqueur ou stubbing comme ceci:

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    user = Factory(:user) 
    get :edit, :id => user.id 
    assigns(:user).should eql(user) 
    end 
end 

Mais à des fins éducatives, je voudrais savoir comment pour le faire fonctionner avec moqueur et talonnage, normalement il serait complètement simple, mais il semble que Devise appelle User.find avant l'action du contrôleur, et fait échouer le test.

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    user = Factory(:user) 
    User.expects(:find).with(:first, :conditions => {:id => 37}).returns(user) 
    get :edit, :id => '37' 
    assigns(:user).should be(user) 
    end 
end 

également en ajoutant twice sur l'attente ce échouerait aussi parce que le premier appel à trouver est différent de celui que je suis la mise en l'attente pour.

Tout aperçu serait apprécié.

Répondre

5

Vous pouvez spécifier plusieurs valeurs de retour avec soit stubs ou expects comme ceci:

require 'test/unit' 
require 'mocha' 

class Foo 
end 

class FooTest < Test::Unit::TestCase 

    # This passes! 
    def test_multiple_returns_with_stubs 
    Foo.stubs(:find).returns('a').returns('b').returns('c') 

    assert_equal('a', Foo.find('z')) 
    assert_equal('b', Foo.find('y')) 
    assert_equal('c', Foo.find('x')) 
    end 

    # This passes too! 
    def test_multiple_returns_with_expects 
    Foo.expects(:find).times(1..3).returns('a').returns('b').returns('c') 

    assert_equal('a', Foo.find('z')) 
    assert_equal('b', Foo.find('y')) 
    assert_equal('c', Foo.find('x')) 
    end 
end 

La différence, apparemment, est que expects a besoin de connaître combien de fois il va être appelé. Si vous ne spécifiez rien, il suppose once et se plaindra lors des appels suivants. stubs s'en moque.

+0

Merci beaucoup, je suis arrivé à une conclusion similaire. Y a-t-il un travail pour avoir un '.with 'différent pour différents appels? J'imagine qu'un autre moyen de contourner ce problème serait d'extirper l'enfer de Devise ... – stuartc

Questions connexes