В моей программе 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? Буду признателен за вашу помощь.
(Этот код основан на моем реальном коде, но не идентичен)