在Ruby on Rails中更改request.remote_ip的值

Mat*_*att 11 ruby ruby-on-rails geokit

出于测试目的,我想更改request.remote_ip的返回值.在我的开发机器上,它总是返回127.0.0.1,但我想给自己不同的假IP来测试我的应用程序的正确行为,而不首先将其部署到实时服务器!

谢谢.

Veg*_*ger 14

如果您希望在整个应用程序中使用此功能,则可能更好/更容易覆盖以下内容中的remote_ip方法app/helpers/application_helper.rb:

class ActionDispatch::Request #rails 2: ActionController::Request
  def remote_ip
    '1.2.3.4'
  end
end
Run Code Online (Sandbox Code Playgroud)

并且1.2.3.4地址随处可用


Veg*_*ger 5

您可以使用以下方法修改请求对象:

request = ActionController::Request.new('REMOTE_ADDR' => '1.2.3.4')
Run Code Online (Sandbox Code Playgroud)

request.remote_ip 现在返回 1.2.3.4


tad*_*man 5

您可以通过在测试环境中为remote_ip值创建一个mutator来作弊,这通常是未定义的.

例如,使用以下内容更改test/test_helper.rb中的类:

class ActionController::TestRequest
  def remote_ip=(value)
    @env['REMOTE_ADDR'] = value.to_s
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,在测试期间,您可以根据需要重新分配:

def test_something
  @request.remote_ip = '1.2.3.4'
end
Run Code Online (Sandbox Code Playgroud)

这可以在单独的测试中完成,也可以在您的设置例程中,在适当的地方完成.

在编写验证IP禁止,地理定位等的功能测试之前,我不得不使用它.


wot*_*oto 5

轨道4.0.1 rc。经过一个小时的搜索,在挖掘代码的同时发现了这个简单的解决方案:)

get '/', {}, { 'REMOTE_ADDR' => '1.2.3.4' }
Run Code Online (Sandbox Code Playgroud)


小智 5

对于集成测试,这适用于rails 5:

get "/path", params: { }, headers: { "REMOTE_ADDR" => "1.2.3.4" }
Run Code Online (Sandbox Code Playgroud)