【问题标题】:RoR: Chained Stub using MochaRoR:使用 Mocha 的链式存根
【发布时间】:2010-10-25 23:28:15
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails testing mocha.js


    【解决方案1】:

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

    【讨论】:

    • 这是一个很晚的回复,但如果它对任何人都有用......你链接到的帖子是一个很好的帖子,但语法很旧。致电stub requires a name as the first argument。所以存根,例如,Rails.env.production? 返回true 将是Rails.stubs(:env).returns(stub('production?', production?: true))
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多