我正在使用geokit-rails
gem来根据通过#geocode_ip_address
(https://github.com/geokit/geokit-rails#ip-geocoding-helper)登录的用户的IP地址执行地理位置。
但是,我很难找到通过Rails 5 IntegrationTest测试的方法。我需要一种在模拟登录时提供多个远程IP地址的方法,但我仍然坚持以下问题:
我原来的方法是跳过它并将:geo_location
信息放在session
哈希中,但是这似乎已经在每个https://github.com/rails/rails/issues/23386的Rails 5中消失了。
有人有类似设置的经验吗?
答案 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"