Как запустить независимые тесты в Ruby? - PullRequest
0 голосов
/ 05 августа 2020

Интересно, как запускать тесты независимо друг от друга в моей весьма специфической настройке.

Контекст:

Я разрабатываю сервис, который отправляет 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 переменную таким образом, чтобы я мог запускать мои тесты свободно и независимо без головной боли?

Спасибо заранее!

...