是否可以使用Mocha存根整个链?例如,我想要存根:
User.first.posts.find(params[:id])
这样它返回一个预定义的post实例而不是访问数据库。理想情况下,我想做类似的事情:
@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')。returns(@post)
答案 0 :(得分:1)
我在这里问了一个类似的问题(以及解决这个问题的方法):How to mock an instance method of an already mocked object?
正如这个问题证明的那样,不确定这是否是正确的方法。
答案 1 :(得分: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)