RoR:使用 Mocha 的链式存根

发布于 2024-09-29 00:51:39 字数 873 浏览 3 评论 0原文

是否可以使用 Mocha 来存根整个链?例如,我想存根:

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

以便它返回预定义的 post 实例而不是访问数据库。理想情况下,我想做类似的事情:

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

如您所见,我将“posts”和“find”方法一起删除。显然这现在不起作用,但是有什么方法可以达到这种效果吗?谢谢。

编辑: 我在网上找到了以下破解方法来做到这一点:

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)

Is it possible to stub an entire chain using Mocha? For example, I want to stub:

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

such that it returns a predefined post instance instead of accessing the database. Ideally, I'd want to do something like:

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

As you can see, I'm stubbing out both the 'posts' and 'find' methods together. Obviously this isn't working right now, but is there a way I can achieve this effect? Thanks.

EDIT:
I found the following online which hacks a way to do this:

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

With this, you can call User.any_instance.stub_path('posts.find').returns(@post)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

颜漓半夏 2024-10-06 00:51:39

基于 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)

Based on http://viget.com/extend/stubbing-method-chains-with-mocha you can try:

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

Although I could only get this form to work:

find = stub
find.stubs(:find).returns(@post)
posts = stub
posts.stubs(:find).returns(find)
User.stubs(:first).returns(posts)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文