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 之外,我不能使用任何其他客户端库。请不要建议它。
问题的重点不仅在于获得解释,还在于获得如何解决问题的建议。预先感谢您的任何解释和建议。
抛出该错误是因为您在测试设置中创建的实例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)
使用实例双精度而不是真实实例使您不必担心类的实际实现细节,同时仍然可以保证您正在调用类支持的方法。