如何在实例变量上存根方法?

lom*_*mpy 2 ruby ruby-mocha

所以我有这个简单的 ruby​​ 类:

class GetRequestList
  def initialize(current_user, filter_hash)
    @authorizer = RequestAuthorizer.new(current_user)
    @filter    = RequestFilter.new(filter_hash)
  end
  def generate
    Request.send_chain(@authorizer.method_chain)
           .send_chain(@filter.method_chain)
  end
end
Run Code Online (Sandbox Code Playgroud)

并且我想测试在隔离和实现中Request接收两种send_chain方法。为此,我正在尝试使用一些存根:RequestAuthorizerRequestFilter

require 'test_helper'

class GetRequestListTest < ActiveSupport::TestCase

  test "request should be filtered by filter and role" do
    Request.expects(:send_chain).twice.returns([build(:request)])
    RequestFilter.stubs(:new)
    RequestFilter.any_instance.stubs(:method_chain).returns([])
    RequestAuthorizer.stubs(:new)
    RequestAuthorizer.any_instance.stubs(:method_chain).returns([])
    assert GetRequestList.new(:current_user, :filter).generate.size == 1
  end
end
Run Code Online (Sandbox Code Playgroud)

你看有什么问题。stubs(:new)返回nil并且在RequestAuthorizerRequestFilter的实例变量中没有实例,GetRequestList我们得到一个错误。我不知道如何在实例变量上存根方法。有什么建议?

Fre*_*ung 5

而不是存根不new返回任何值,让它返回一些东西,例如

mock_request_filter = mock()
RequestFilter.stubs(:new).returns(mock_filter)
Run Code Online (Sandbox Code Playgroud)

这也使您能够读取存根any_instance- 只需将它们设置为打开即可mock_request_filter