Rails 5 IntegrationTest与IP地理定位

时间:2017-02-09 02:32:30

标签: ruby-on-rails geolocation integration-testing ruby-on-rails-5 geokit

我正在使用geokit-rails gem来根据通过#geocode_ip_addresshttps://github.com/geokit/geokit-rails#ip-geocoding-helper)登录的用户的IP地址执行地理位置。

但是,我很难找到通过Rails 5 IntegrationTest测试的方法。我需要一种在模拟登录时提供多个远程IP地址的方法,但我仍然坚持以下问题:

  • 如何欺骗IP地址(根据用户登录情况而有所不同)
  • 如何防止向地理定位服务发出大量请求

我原来的方法是跳过它并将:geo_location信息放在session哈希中,但是这似乎已经在每个https://github.com/rails/rails/issues/23386的Rails 5中消失了。

有人有类似设置的经验吗?

1 个答案:

答案 0 :(得分:0)

根据geokit-rails https://github.com/geokit/geokit-rails/blob/master/lib/geokit-rails/ip_geocode_lookup.rb#L44中ip查找的实现,您可以简单地将remote_ip对象上的request方法存根。

一旦geokit-rails根据您的IP找到一个geo_location,它将它作为geo_location对象存储在session中。您可能不希望在开发/测试中出现这种“缓存”行为,因此我将在欺骗IP之前删除该对象。

这里是一个示例实现:

class SomeController < ApplicationController
  prepend_before_action :spoof_remote_ip if: -> { %w(development test).include? Rails.env }
  geocode_ip_address

  def index
    @current_location = session[:geo_location]
  end

  def spoof_remote_ip
    session.delete(:geo_location) if session[:geo_location]
    request.env["action_dispatch.remote_ip"] = ENV['SPOOFED_REMOTE_ADDR']
  end
end
# .env
SPOOFED_REMOTE_ADDR = "xx.xxx.xx.xxx"