Интересно, как запускать тесты независимо друг от друга в моей весьма специфической настройке.
Контекст:
Я разрабатываю сервис, который отправляет SMS. Обычно он принимает вызовы API от другой платформы и на основе их содержимого решает отправить SMS клиенту, в зависимости от языка человека, типа события и многих других факторов. Он загружает файл конфигурации при каждой загрузке (я загружаю его один раз, затем использую класс App
для хранения конфигурации в памяти, которую я импортирую в другие файлы):
class App
def self.config
@@config
end
@@config = begin
YAML.load(File.open(File.expand_path("config.yml", File.dirname(__FILE__))), symbolize_names: true)
rescue
puts "ERROR: The config.yml file is malformed."
exit(500)
end
def self.another_function(...)
...
end
end
Проблема:
Где болит, так это во время тестов. Поведение моего приложения зависит от различных параметров, которые я даю в файле конфигурации. Поэтому я использую App.stub(:config, {my_new_config_hash}) do ... end
, чтобы изменить среду, в которой развивается программа. Точно так же (с использованием Mocha):
describe "..." do
it "..." do
stubbed_config = App.config.deep_merge({ api: { default_api: 'Spryng' } })
App.stub(:config, stubbed_config) do
VCR.use_cassette("sms_spryng") do
# This is supposed to build and send an SMS. Inside, the App.config variable will be accessed many times.
res = build_and_send_the_sms(Stubs.create_request({ stopNotif: 'false', pickupTask: 'true', metadata: '[]' }))
assert '200', res, "Returned no success code"
end
end
end
end
Но в основном у меня есть много этих тестов, и даже если я изначально думал, что среда каждого теста действительно независимы, ну ... похоже, что это не так.
Если я запускаю тесты один за другим, все они проходят правильно. В противном случае похоже, что они выполняются в одно и то же время, и что заглушка App.config
в тесте «a» оказывает влияние на тест «b» (потому что тесты ведут себя так, как будто App.config не был заглушен, как написано) .
Пример:
Рассмотрим следующий тест:
it 'should spot misspelled variable names' do
stubbed_config = App.config.deep_merge({ sms: { default_language: 'fr',
fr: { pickup: < A MALFORMED MESSSAGE > } } })
App.stub(:config, stubbed_config) do
res = build_and_send_the_sms(Stubs.create_request({ stopNotif: 'false', pickupTask: 'true', metadata: '[]' }))
assert_match '500', res, "Returned no success code"
end
end
Когда я запускаю его в одиночку, он предлагает:
============ ERROR: SMS was not sent =============
The config file is not properly formatted. Couldn't build the SMS message.
.. .Что именно так. Но когда все вместе, это выводит:
============ ERROR: SMS was not sent =============
The SMS API failed (Spryng) --> message: 'Bonjour Cest beau la vie'
Что дает совершенно другую ошибку и показывает, что внутренне содержимое App.config[:sms][:fr][:pickup]
не может быть таким же.
Итак, это мой вопрос:
Как я могу заглушить эту App.config
переменную таким образом, чтобы я мог запускать мои тесты свободно и независимо без головной боли?
Спасибо заранее!