изменить среду рельсов в середине тестирования - PullRequest
36 голосов
/ 24 ноября 2010

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

Ответы [ 5 ]

73 голосов
/ 03 февраля 2012

Вы можете сделать

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

Тогда Rails.env, Rails.development? и т. Д. Будут работать, как и ожидалось.

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

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

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

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

16 голосов
/ 05 июня 2014

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

it "should do something specific for production" do 
  allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
  #other assertions
end
5 голосов
/ 19 октября 2014

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

В зависимости от вашего случая, в качестве альтернативы вы можете просто вернуть значение, необходимое для теста, чтобы он думал, что он находится в другой среде.Например, если вы хотите, чтобы 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? и т. Д. Если вам не нужна полная возможность возврата полной среды, это может быть другой вариант.

0 голосов
/ 02 марта 2017

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

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.

0 голосов
/ 01 июня 2011

Если вы используете что-то вроде 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...