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

Изменение среды рельсов в середине тестирования

Как изменить переменную среды рельсов при тестировании

4b9b3361

Ответ 1

Вы могли бы сделать

Rails.stub(env: ActiveSupport::StringInquirer.new("production"))

Затем Rails.env, Rails.development? и т.д. будут работать как ожидалось.

С RSpec 3 или более поздней версией вы можете использовать новый синтаксис "zero monkeypatching" (как упоминалось в @AnkitG в другом ответе), чтобы избежать предупреждений об отказе:

allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))

Обычно я определяю метод stub_env в spec-помощнике, поэтому мне не нужно вставлять все эти строки в мои тесты.

Возможность рассмотреть (как предложено в комментарий здесь) заключается в том, чтобы вместо этого полагаться на еще более целенаправленную конфигурацию, которую вы можете установить в своих файлах среды и изменить тесты.

Ответ 2

Rspec 3 вперед вы можете сделать

it "should do something specific for production" do 
  allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
  #other assertions
end

Ответ 3

Иногда возвращение другой переменной среды может быть головной болью (требуемые переменные рабочей среды, предупреждающие сообщения и т.д.).

В зависимости от вашего случая, в качестве альтернативы вы можете просто вернуть значение, необходимое для теста, чтобы подумать об этом в другой среде. Например, если вы хотите, чтобы Rails верил, что в производстве для кода, который проверяет Rails.env.production?, вы можете сделать что-то вроде этого:

it "does something specific when in production" do 
  allow(Rails.env).to receive(:production?).and_return(true)
  ##other assertions
end

Вы можете сделать то же самое для других сред, таких как :development?, :staging? и т.д. Если вам не нужна полная возможность возврата полной среды, это может быть другой вариант.

Ответ 4

Как более простое изменение в нескольких ответах выше, это работает для меня:

allow(Rails).to receive(:env).and_return('production')

Или, поскольку, как я делаю в shared_examples, передайте это в переменной:

allow(Rails).to receive(:env).and_return(target_env)

Я подозреваю, что это отстает от решения ...StringInquirer..., так как ваше приложение использует дополнительные методы для проверки среды (например, env.production?, но если код просто запрашивает Rails.env, это намного более читаемо. YMMV.

Ответ 5

Если вы используете что-то вроде rspec, вы можете заглушить Rails.env, чтобы вернуть другое значение для конкретного тестового примера, который вы используете:

it "should log something in production" do
  Rails.stub(:env).and_return('production')
  Rails.logger.should_receive(:warning).with("message")
  run_your_code
end