rspec if Rails.env.production? возвращаемая строка как это реализовать? - PullRequest
0 голосов
/ 06 ноября 2018

И это не работает. Можете ли вы помочь мне, как написать правильный тест для своего случая? Спасибо большое. # Model.rb

def driver_iq_api
  if Rails.env.production?
    'https://admin.sss/xmlpost.cfm'
  else
    'https://eeem/ws/xmlpost.cfm'
  end
end

model_spec.rb

describe 'private methods' do
 context '.driver_iq_api' do
  it 'production true' do
    allow(Rails.env).to receive(:production?) {true}.and_return('https://admin.sss/xmlpost.cfm')
  end
  it 'production false' do
    allow(Rails.env).to receive(:production?) {false}.and_return('https://eeem/ws/xmlpost.cfm')
  end
 end
end

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Установка Rails.env на что-то отличное от test внутри теста - плохая идея. Хотя в этом случае вы можете «сойти с рук», это может вызвать всевозможные странные побочные эффекты в целом, такие как запись данных в не тестовую базу данных.

Кроме того, , кажется, вы пишете модульные тесты для частных методов, что, как правило, является плохой идеей. Вы должны только нормально протестировать открытый интерфейс класса.

Как указано выше, этот тип конфигурации в идеале должен находиться в файле конфигурации, например, например. application.yml.

Другой ответ уже показывает, как вы могли бы заглушить поведение, но в качестве еще одной альтернативы вы могли бы рассмотреть внедрение среды как зависимость метода:

def driver_iq_api(env: Rails.env)
  if env.production?
    'https://admin.sss/xmlpost.cfm'
  else
    'https://eeem/ws/xmlpost.cfm'
  end
end

describe '#driver_iq_api' do
  it 'production env' do
    expect(model.driver_iq_api(env: 'production'.inquiry)).to eq 'https://admin.sss/xmlpost.cfm'
  end
  it 'test env' do
    expect(model.driver_iq_api(env: 'test'.inquiry)).to eq 'https://eeem/ws/xmlpost.cfm'
  end
end

Обратите внимание, что, например, 'test'.inquiry возвращает экземпляр ActiveSupport::StringInquirer, который аналогичен вызову Rails.env.

... Но, повторяя мою первоначальную точку зрения, я бы вообще не стал проверять этот метод.

0 голосов
/ 06 ноября 2018

Я согласен, вы должны вытащить это в конфиг, так как он статический, но чтобы ответить на ваш вопрос:

it "when production" do
  allow(Rails.env).to receive(:production?).and_return(true)
  expect(my_class.send(:driver_iq_api)).to eq('https://admin.sss/xmlpost.cfm')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...