Ответ 1
Это сработает.
Другим способом было бы установить слой косвенности между вашим кодом и переменными окружения, например, какой-то объект конфигурации, который легко высмеивать.
Я тестирую некоторый код, который вытягивает свою конфигурацию из переменных окружения (заданных конфигурациями конфигурации Heroku в производстве, для локальной разработки я использую мастер).
Какой лучший способ проверить этот тип кода с помощью RSpec?
Я придумал это:
before :each do
ENV.stub(:[]).with("AWS_ACCESS_KEY_ID").and_return("asdf")
ENV.stub(:[]).with("AWS_SECRET_ACCESS_KEY").and_return("secret")
end
Если вам не нужно проверять разные значения переменных среды, я думаю, вы могли бы установить их в spec_helper
вместо этого.
Это сработает.
Другим способом было бы установить слой косвенности между вашим кодом и переменными окружения, например, какой-то объект конфигурации, который легко высмеивать.
Вы также можете заглушить константу:
stub_const('ENV', {'AWS_ACCESS_KEY_ID' => 'asdf'})
Или, если вы все еще хотите, чтобы остальная часть ENV:
stub_const('ENV', ENV.to_hash.merge('AWS_ACCESS_KEY_ID' => 'asdf'))
Как Heroku предлагает, вы можете использовать файл Foreman .env
для хранения переменных среды для разработки.
Если вы это сделаете, вы можете использовать foreman run
для запуска своих спецификаций:
foreman run bundle exec rspec spec
Я бы избежал ENV.stub(: []) - он не работает, если другие вещи используют ENV, такие как pry (вы получите сообщение об ошибке, требующей заглушить DISABLE_PRY).
stub_const работает хорошо, как уже указывалось.
Вы можете использовать https://github.com/littleowllabs/stub_env для достижения этой цели. Это позволяет вам заглушить отдельные переменные среды, не разбирая их все, как предлагалось ваше решение.
Установите драгоценный камень, затем напишите
before :each do
stub_env('AWS_ACCESS_KEY_ID', 'asdf')
stub_env('AWS_SECRET_ACCESS_KEY','secret')
end
Вы хотите драгоценный камень dotenv.
Выполнение тестов под руководством мастера, как предлагает @ciastek, отлично работает при запуске спецификаций из CLI. Но это не помогает мне запускать спецификации с Ruby Test в Sublime Text 2. Dotenv делает именно то, что вы, прозрачно.
Если вы используете dotenv, чтобы настроить среду во время тестов, но нужно изменить переменную env для определенного test, тогда может быть полезен следующий подход.
Более простой метод, чем stubbing ENV
, заключается в замене среды на время теста, а затем восстановить ее следующим образом:
with_environment("FOO" => "baz") do
puts ENV.fetch("FOO")
end
Использование вспомогательного помощника (из Источник домашней рекламы):
module Test
module Helper
module Env
def with_environment(partial_env)
old = ENV.to_hash
ENV.update partial_env
begin
yield
ensure
ENV.replace old
end
end
end
end
end
При использовании ensure
исходная среда восстанавливается, даже если тест не выполняется.
Там есть удобное сравнение методов настройка и изменение переменных среды во время тестов, включая обнуление ENV
, замена значений до/после тест и драгоценные камни, такие как ClimateControl.