2015-07-14 7 views
1

В моей программе Ruby (not Rails) я создал глобальные переменные в модуле верхнего уровня. Эти глобальные переменные устанавливаются как клиенты внешних служб, поэтому моя программа вызывает вызовы API, когда они установлены. Я пытаюсь выяснить, как правильно заглушить эти вызовы API в RSpec.RSpec: вызов Stub API, который устанавливает глобальную переменную

Я хотел бы протестировать класс внутри верхнего модуля, который выглядит примерно так. Рабочий не имеет прямого вызова глобальных переменных в любом месте класса.

module TopModule 
    class Worker 
    end 
end 

Вот в модуле верха:

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

Я хотел бы запустить тест RSpec из :: Worker модуле верха, поэтому она передает:

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_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 

Где я могу поставить заглушки, так что будет на самом деле обрабатывать API вызова ExternalService? Буду признателен за вашу помощь.

(Этот код основан на моем реальном коде, но не идентичен)

ответ