Как изменить переменную среды рельсов при тестировании
Изменение среды рельсов в середине тестирования
Ответ 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