【问题标题】:How to rspec mock Net::HTTP calls deep in my library?如何在我的库中对 Net::HTTP 调用进行 rspec 模拟?
【发布时间】:2019-09-03 20:52:03
【问题描述】:

我正在更新一个使用非常旧版本的 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”来测试我的应用程序,但是在应用程序本身的深处是这个 response.stub

显然我应该使用“double()”和“allow(object).to receive(...)”,但我看到的所有示例都是直接在测试的“it”块中使用 double,这段代码离它还很远。如果我真的尝试使用 double 我只会得到一个 no method 错误。

WebMocks 似乎是一个非常大的锤子,可以替换这个单一的调用。

也许正确的做法是创建一个 Net::HTTPOK 的超类并以该超类的新内容传递响应数据?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    模拟http的最佳方式,使用名为iswebmock的gem

    【讨论】:

    • “最佳”非常主观,基于您的个人意见。您能否提供一些示例说明为什么 OP 应该使用 webmock 以及一些代码示例?
    【解决方案2】:

    嗯。好的,所以包装类方法比我预期的要容易得多。在我的规范文件中,我添加了:

    class HttpWrapper < Net::HTTPOK
        def initialize(data, *args)
            @data = data
            super(*args)
        end
    
        def content_type
            'text/json'
        end
    
        def body
            @data
        end
    end
    

    (奇怪的细节:如果我用“body”替换上面的每个“data”实例,它就会爆炸。)

    我现在有问题的代码块:

                response = HttpWrapper.new(contents_raw, 1.0, "200", "OK")
    

    这似乎已经成功了。

    如果出于某种原因这是一个糟糕的主意,希望有人能告诉我。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 2010-09-12
      • 2017-01-09
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多