2010-10-25 24 views
1

Est-il possible de tronquer une chaîne entière en utilisant Mocha? Par exemple, je veux stub:RoR: tronçon enchaîné à l'aide de Mocha

User.first.posts.find(params[:id]) 

telle qu'elle renvoie une instance de poste prédéfini au lieu d'accéder à la base de données. Idéalement, je veux faire quelque chose comme:

@post = Post.new 
User.any_instance.stubs(:posts,:find).returns(@post) 

Comme vous pouvez le voir, je suis stubbing à la fois les « postes » et « trouver » des méthodes ensemble. De toute évidence, cela ne fonctionne pas pour le moment, mais y a-t-il un moyen de parvenir à cet effet? Merci.

EDIT: J'ai trouvé la ligne suivante qui hacks une façon de le faire:

module Mocha 
    module ObjectMethods 
    def stub_path(path) 
     path = path.split('.') if path.is_a? String 
     raise "Invalid Argument" if path.empty? 
     part = path.shift 
     mock = Mocha::Mockery.instance.named_mock(part) 
     exp = self.stubs(part) 
     if path.length > 0 
     exp.returns(mock) 
     return mock.stub_path(path) 
     else 
     return exp 
     end 
    end 
    end 
end 

Avec cela, vous pouvez appeler User.any_instance.stub_path ('posts.find') renvoie (. @post)

Répondre

0

Basé sur http://viget.com/extend/stubbing-method-chains-with-mocha vous pouvez essayer:

User.stubs(:first).returns(stub(:posts => stub(:find => @post))) 

Bien que je ne pouvais obtenir ce formulaire pour travailler:

find = stub 
find.stubs(:find).returns(@post) 
posts = stub 
posts.stubs(:find).returns(find) 
User.stubs(:first).returns(posts) 
+0

Il s'agit d'une réponse très en retard, mais au cas où il serait utile à tout le monde ... Le message que vous avez lié est bon, mais la syntaxe est ancienne. L'appel de [stub nécessite un nom comme premier argument] (http://gofreerange.com/mocha/docs/Mocha/API.html#stub-instance_method). Ainsi, par exemple, Rails.env.production? 'Pour renvoyer' true' serait 'Rails.stubs (: env) .returns (stub ('production?', Production ?: true))' –