ruby (rails) Net::HTTPResponse 未定义的方法已关闭?

Tim*_*oss 5 ruby rspec ruby-on-rails net-http

Ruby-on-Rails,Net::HTTPResponse NoMethodError:未定义的方法“已关闭?” 对于零:NilClass

您好,我遇到了一个问题:我使用 RSpec 框架,我需要在我测试的方法中模拟响应。

这是该方法的示例:

def perform_request
    response = DataClient.new.request(arg: 'some_arg')
    # do some thing with the response
end 

RSpec file:
    describe '#perform_request'
      let(:response) do
        Net::HTTPResponse.new(1.0, 200, "OK")
      end

      let(:double_response) {double('DataClient', request: response)}

      before do
       response.body = {some_key:some_value}.to_json
       allow(DataClient).to receive(:new).and_return(double_response)   
      end

     it 'returns a response body' do
       MyClass.new.perform_request
       expect(response.body).to eq({some_key:some_value}.to_json)
     end 
   end
Run Code Online (Sandbox Code Playgroud)

当我尝试调用 Net::HTTPResponse 实例的“body”方法来读取它的主体时,就会出现问题。

它抛出 NoMethodError 和消息“未定义的方法`关闭?' 对于 nil:NilClass" 我不知道。

我试图搜索任何带有问题变体的解释,例如“Net::HTTPResponse body undefined method closed?'', 'Ruby Net:: HTTPResponse body undefined methodclosed?”、“Ruby undefined method `closed?” 但找不到任何相关的答案。

事先,我不得不说除了没有任何包装器的 Net:: HTTP 之外,我不能使用任何其他客户端库。请不要建议它。

问题的重点不仅在于获得解释,还在于获得如何解决问题的建议。预先感谢您的任何解释和建议。

Fit*_*row 4

抛出该错误是因为您在测试设置中创建的实例Net::HTTPResponse正在尝试验证它期望从中获取数据的连接是否已关闭。

我不会费心Net::HTTPRequest在您的测试设置中创建一个实际的实例。你的类所知道的就是DataClient.new.request返回一个响应 的对象.body。我将更改您的设置如下:

let(:response){ instance_double(Net::HTTPResponse, body: response_body)}
Run Code Online (Sandbox Code Playgroud)
let(:response_body) { { key: :value }.to_json }
Run Code Online (Sandbox Code Playgroud)

使用实例双精度而不是真实实例使您不必担心类的实际实现细节,同时仍然可以保证您正在调用类支持的方法。