2010-10-24 14 views
3

J'ai besoin de se moquer de ce qui suit:Comment se moquer d'une méthode d'instance d'un objet déjà mocké?

Class User 
    def facebook 
    #returns an instance of a facebook gem 
    end 
end 

Alors dans mes tests utilisateurs, d'accéder aux informations de l'utilisateur facebook Je dois appeler user.facebook.me.info pour récupérer ses informations. Si je veux moquer, je suis actuellement en utilisant les éléments suivants:

@user = Factory(:user) 
facebook = mock() 
me = mock() 
me.expects(:info).returns({"name" => "John Doe"}) 
facebook.expects(:me).returns(me) 
@user.expects(:facebook).returns(facebook) 
assert_equal "John Doe", @user.facebook.me.info["name"] 

Cela fonctionne, mais semble un peu difficile à manier, est-il une meilleure façon de le faire?

[modifier] J'utilise mocha comme cadre moqueur

+0

Quel cadre de moquerie utilisez-vous? – Reactormonk

+0

J'utilise le moka. – pjaspers

Répondre

12

Vous pouvez essayer quelque chose comme ceci: -

user = Factory(:user) 
user.stubs(:facebook => stub(:me => stub(:info => {:name => "John Doe"}))) 

Si vous voulez vraiment vérifier que toutes ces méthodes sont appelées (que je soupçonne vous ne), vous pouvez effectuer les opérations suivantes: -

user = Factory(:user) 
user.expects(:facebook => mock(:me => mock(:info => {:name => "John Doe"}))) 

il est un peu plus bavard, mais il est généralement utile de donner à chaque objet simulé un nom: -

user = Factory(:user) 
user.stubs(:facebook => stub('facebook', :me => stub('me', :info => {:name => "John Doe"}))) 

J'espère que cela aide.

+0

Cela ressemble à la solution la plus propre là-bas. Merci! – pjaspers

0

Si vous ne voulez pas vérifier que toutes les méthodes sont appelées, vous pouvez également utiliser différentes alternatives à la simulation. Par exemple, vous pouvez utiliser un OpenStruct.

@user = Factory(:user) 
facebook = mock() 
me = mock() 
me.expects(:info).returns({"name" => "John Doe"}) 
facebook.expects(:me).returns(me) 
@user.expects(:facebook).returns(facebook) 
assert_equal "John Doe", @user.facebook.me.info["name"] 

devient

@user = Factory(:user) 
@facebook = OpenStruct.new(:me => OpenStruct.new(:info => {:name => "John Doe"})) 
@user.expects(:facebook).returns(@facebook) 

Cette solution vous offre également l'avantage que vous pouvez modifier les propriétés de @facebook dans vos tests, si vous avez besoin de tester différentes conditions.