Подтвердить что ты не робот

Каков наилучший способ написать спецификации для кода, который зависит от переменных среды?

Я тестирую некоторый код, который вытягивает свою конфигурацию из переменных окружения (заданных конфигурациями конфигурации 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 вместо этого.

4b9b3361

Ответ 1

Это сработает.

Другим способом было бы установить слой косвенности между вашим кодом и переменными окружения, например, какой-то объект конфигурации, который легко высмеивать.

Ответ 2

Вы также можете заглушить константу:

stub_const('ENV', {'AWS_ACCESS_KEY_ID' => 'asdf'})

Или, если вы все еще хотите, чтобы остальная часть ENV:

stub_const('ENV', ENV.to_hash.merge('AWS_ACCESS_KEY_ID' => 'asdf'))

Ответ 3

Как Heroku предлагает, вы можете использовать файл Foreman .env для хранения переменных среды для разработки.

Если вы это сделаете, вы можете использовать foreman run для запуска своих спецификаций:

foreman run bundle exec rspec spec

Ответ 4

Я бы избежал ENV.stub(: []) - он не работает, если другие вещи используют ENV, такие как pry (вы получите сообщение об ошибке, требующей заглушить DISABLE_PRY).

stub_const работает хорошо, как уже указывалось.

Ответ 5

Вы можете использовать https://github.com/littleowllabs/stub_env для достижения этой цели. Это позволяет вам заглушить отдельные переменные среды, не разбирая их все, как предлагалось ваше решение.

Установите драгоценный камень, затем напишите

before :each do
  stub_env('AWS_ACCESS_KEY_ID', 'asdf')
  stub_env('AWS_SECRET_ACCESS_KEY','secret')
end

Ответ 6

Вы хотите драгоценный камень dotenv.

Выполнение тестов под руководством мастера, как предлагает @ciastek, отлично работает при запуске спецификаций из CLI. Но это не помогает мне запускать спецификации с Ruby Test в Sublime Text 2. Dotenv делает именно то, что вы, прозрачно.

Ответ 7

Если вы используете 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.