我执行以下操作:
class FakeResponse
def body
'access_token=token'
end
end
Net::HTTP.stub(:get_response).and_return(FakeResponse.new)
这很好用,但我也想测试一下,请求的URL是什么。所以我做了
url = 'http://google.de'
Net::HTTP.stub(:get_response).with(URI.parse(url)).and_return(FakeResponse.new)
这不起作用,因为它不是URI的相同实例。事实上,我只想测试该URI的实例变量。
是否有某种方法可以用较少的痛苦来调用块或某些东西来进行此测试?
答案 0 :(得分:1)
你可以试试这个:
original_get_response = Net::HTTP.method(:get_response)
Net::HTTP.stub(:get_response) do |uri|
(uri.to_s == 'http://google.de') ? FakeResponse.new : original_get_response.call(uri)
end
观察一年前添加and_call_original
的讨论,似乎存储和调用这样的原始方法是一种非常常见(但很尴尬)的习惯用法。 (现在可能有一个original_method
电话可用,但我没有方便测试它。)
编辑:稍后,我进入了构建并尝试使用.with(URI('...'))
,这很正常。除非我误解了这个问题?
require 'spec_helper'
require 'net/http'
describe :nethttp do
before :each do
Net::HTTP.stub(:get_response).and_return('something')
Net::HTTP.stub(:get_response).with(URI('http://www.google.com')).and_return('something else')
end
it { Net::HTTP.get_response(URI('http://www.google.com')).should eql 'something else' }
it { Net::HTTP.get_response(URI('http://www.google.co.uk')).should eql 'something' }
end