RoR:使用摩卡链接存根

时间:2010-10-25 23:28:16

标签: ruby-on-rails testing mocha

是否可以使用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)

2 个答案:

答案 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)