2010-10-25 39 views
1

使用摩卡可以存留整個鏈嗎?例如,我想要存根:RoR:使用摩卡的鏈式存根

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

使得它返回一個預定義的後期實例,而不是訪問數據庫。理想情況下,我願意做這樣的事情:

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

正如你所看到的,我刪空雙方的帖子「和「發現」方法一起使用。顯然這不是現在正在工作,但有沒有辦法達到這種效果?謝謝。

編輯: 我發現下面的網上黑客哪一種方式來做到這一點:

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 

有了這個,你可以調用User.any_instance.stub_path( 'posts.find')返回(。 @post)

回答

0

基於http://viget.com/extend/stubbing-method-chains-with-mocha你可以試試:

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

雖然我只能得到這種形式的工作:

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

這是一個非常晚的答覆,但萬一它對任何人都有用......您鏈接的帖子是一個很好的帖子,但語法很舊。調用[存根需要一個名稱作爲第一個參數](http://gofreerange.com/mocha/docs/Mocha/API.html#stub-instance_method)。因此,例如,將'Rails.env.production?'作爲返回'true'的存根就是'Rails.stubs(:env).returns(stub('production?',production ?: true))' – 2017-08-16 19:55:50