如何在我的库中深入rspec模拟Net :: HTTP调用?

时间:2019-04-13 06:19:35

标签: ruby rspec

我正在更新一个使用非常旧版本的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的超类,并以超类的新特性传递响应数据?

2 个答案:

答案 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