Как правильно имитировать переменные среды при написании модульных тестов с использованием минитеста для Ruby on Rails?
Итак, я исхожу из Python, где стандартным способом является использование декоратора следующим образом:
@mock.patch.dict(os.environ, {'mocked_key': 'mocked_result'}
Я немного удивлен, что не смог найти ничего подобного в минитесте при поиске в документации и переполнении стека.
Любые рекомендации по наилучшему подходу к этому будут высоко оценены!





Вы можете устанавливать и сбрасывать переменные среды с помощью метода, например:
# in test_helper.rb (for example)
def mock_env(partial_env_hash)
old = ENV.to_hash
ENV.update partial_env_hash
begin
yield
ensure
ENV.replace old
end
end
# usage
mock_env('MY_ENV_VAR' => 'Hello') do
assert something?
end
В качестве альтернативы вы можете использовать гем Climate_control для управления переменными среды:
ClimateControl.modify CONFIRMATION_INSTRUCTIONS_BCC: '[email protected]' do
sign_up_as '[email protected]'
confirm_account_for_email '[email protected]'
expect(current_email).to bcc_to('[email protected]')
end
Также есть достойная статья под названием Как переменные среды делают ваш набор тестов Ruby ненадежным, в которой более подробно рассказывается о том, как устанавливать и сбрасывать переменные среды во время тестов, если вы хотите прочитать о некоторых других вариантах.
Да, вспомогательный метод в основном такой же, как блок before и after.
Фантастика, спасибо. Один дополнительный вопрос: у меня уже есть насмешки в моем тесте, поэтому я стараюсь избегать использования блока
do... Является ли альтернатива просто случаем измененияENVперед выполнением и возврата к старому значению после?