Тест для RSpec для обработки IP-адреса


Я хочу, чтобы заменить массив с IPS матрицей метод (как known_ips или просто ips) но я не знаю как.

Я буду использовать этот known_ips где-то еще.

describe WelcomeController, type: :controller do
  [
    {
      ip: '73.53.61.23',
      location_name: 'Seattle, Washington, US'
    }, {
      ip: '8.26.157.16',
      location_name: 'San Francisco, California, US'
    }, {
      ip: '174.112.13.21',
      location_name: 'Mississauga, Ontario, CA'
    }
  ].each do |params|
    it 'geolocalizes the visitor based on the ip' do
      allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return params[:ip]
      get :index
      expect(controller.current_location.name).to eq params[:location_name]
    end
  end
end


Комментарии
1 ответ


Я буду использовать этот known_ips где-то еще.

Я предполагаю, что "где-то" по-прежнему будет в тестовый файл. Если это так, вы можете поместить этот файл в поддержку (которая является общей патерн в для RSpec).

# spec/support/ip_list.rb
IP_LIST = [
# easily to recognize that IP address is first and the location name the second, but you can use your code that uses Hash here
['73.53.61.23', 'Seattle, Washington, US'],
['8.26.157.16', 'San Francisco, California, US'],
['174.112.13.21', 'Mississauga, Ontario, CA']
]

Затем на spec_helper.rb (см. В этом примере)

# spec/spec_helper.rb
# after the last require
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

И в сам тест:

describe WelcomeController, type: :controller do
it 'geolocalizes the visitor based on the ip' do
IP_LIST.each do |(ip, location_name)|
expect(controller.request).to receive(:remote_ip).and_return ip
get :index
expect(controller.current_location.name).to eq location_name
end
end
end

Обратите внимание, что я вложенные IP_LIST.each внутри it блок, я не думаю, что нужно зделать it для каждого теста. Это личное мнение, я не уверен, что лучшие практики здесь.

1
ответ дан 2 марта 2018 в 07:03 Источник Поделиться