我正在更新一个使用非常旧版本的RSpec(2.9.0)的应用程序。在3.8上可以正常使用,但是我收到有关以下代码的弃用错误:
response = Net::HTTPOK.new(1.0, "200", "OK")
response.stub(:content_type => 'text/json', :body => contents_raw)
现在,此代码是对外部API的模拟调用,它深入到我的代码的库中。我正在测试的应用程序是Sinatra应用程序,因此我使用的是Rack :: Test :: Methods中的“ get”来测试我的应用程序,但是此响应本身在应用程序的深处
显然,我应该使用“ double()”和“ allow(object).to receive(...)”,但是我看到的所有示例都是直接在测试的“ it”块中使用double的,这段代码不远了。如果我实际上尝试使用double,则只会出现无方法错误。
WebMocks似乎是一个很大的锤子,只需替换此单个调用即可。
也许正确的做法是创建Net :: HTTPOK的超类,并以超类的新特性传递响应数据?
答案 0 :(得分:0)
嗯。好的,所以包装器类方法比我预期的要容易得多。在我的规格文件中,我添加了:
class HttpWrapper < Net::HTTPOK
def initialize(data, *args)
@data = data
super(*args)
end
def content_type
'text/json'
end
def body
@data
end
end
(Bizarre详细信息:如果我用“ body”替换上面的“ data”的每个实例,它都会爆炸。)
在有问题的代码块中,我现在有:
response = HttpWrapper.new(contents_raw, 1.0, "200", "OK")
这似乎很好地解决了问题。
如果由于某种原因这是一个糟糕的主意,希望有人会让我知道。 :)
答案 1 :(得分:0)
模拟http的最好方法是使用名为webmock
的gem