RSpec:Stub API调用,用于设置全局变量

时间:2015-07-14 21:02:09

标签: global-variables stub ruby-2.0 rspec3

在我的Ruby(非Rails)程序中,我在顶级模块中创建了全局变量。这些全局变量被设置为外部服务的客户端,因此我的程序在设置时会调用API。我试图弄清楚如何在RSpec中正确地存根这些API调用。

我想在顶层模块中测试一个类,看起来或多或少是这样的。 Worker不会直接在类中的任何位置调用全局变量。

module TopModule
  class Worker
  end
end

这是TopModule:

module TopModule
  # (As an aside, the external service is AWS)
  $client = ExternalService::Client.new(ExternalService.config)
end

我想运行TopModule :: Worker的RSpec测试,以便传递:

describe TopModule::Worker do
  it 'shows in various ways that Worker functions'
end

但是,我收到以下错误:Real HTTP connections are disabled. Unregistered request: GET http://... with headers {...} (WebMock::NetConnectNotAllowedError)

堆栈跟踪指向TopModule中定义$ client的行。

我还告诉他们:

You can stub this request with the following snippet:

stub_request(:get, "http://...").
  with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'...', 'User-Agent'=>'Ruby'}).
  to_return(:status => 200, :body => "", :headers => {})

当我将存根添加到spec / spec_helper RSpec.configure循环时,我仍然有错误。以下是spec_helper的相关部分:

require 'webmock/rspec'
require 'codeclimate-test-reporter'
WebMock.disable_net_connect!(allow: 'codeclimate.com')

require 'fileutils'
require 'top_module'
Dir['./spec/support/**/*.rb'].sort.each { |f| require f }

RSpec.configure do |config|
  config.mock_with :rspec do |mocks|
    mocks.verify_doubled_constant_names = true
    mocks.verify_partial_doubles = true
  end
end

def files_directory
  File.dirname(__FILE__) + '/files'
end

我可以在哪里放置存根,以便实际处理ExternalService API调用?我很感激你的帮助。

(此代码基于我的实际代码,但不完全相同)

1 个答案:

答案 0 :(得分:0)

您可以使用VCR来存储外部api呼叫。

https://github.com/vcr/vcr