11

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

谢谢你。

4

7 回答 7

15

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

class ActionDispatch::Request #rails 2: ActionController::Request
  def remote_ip
    '1.2.3.4'
  end
end

而且1.2.3.4地址随处可见

于 2010-01-08T23:36:42.580 回答
5

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

request = ActionController::Request.new('REMOTE_ADDR' => '1.2.3.4')

request.remote_ip现在返回 1.2.3.4

于 2010-01-08T18:55:49.790 回答
5

您可以通过在通常未定义的测试环境中为 remote_ip 值创建一个变异器来作弊。

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

class ActionController::TestRequest
  def remote_ip=(value)
    @env['REMOTE_ADDR'] = value.to_s
  end
end

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

def test_something
  @request.remote_ip = '1.2.3.4'
end

这可以在单独的测试中完成,也可以在您的设置例程中进行,只要合适。

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

于 2010-01-08T22:49:02.113 回答
5

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

get '/', {}, { 'REMOTE_ADDR' => '1.2.3.4' }
于 2013-05-18T07:28:30.343 回答
5

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

get "/path", params: { }, headers: { "REMOTE_ADDR" => "1.2.3.4" }
于 2017-04-26T12:25:36.663 回答
3

我现在最终做的是把这段代码放在config/environments/development.rb文件的末尾,以确保它只在开发时执行

# fake IP for manuel testing
class ActionController::Request
  def remote_ip
    "1.2.3.4"
  end
end

所以这会在服务器启动时将 remote_ip 设置为 1.2.3.4。每次更改值时都必须重新启动服务器!

于 2010-01-09T00:11:03.080 回答
0

此答案仅适用于 rails3(我在尝试回答 rails 3 的类似问题时找到了此答案),

因此,如果有人试图在 Rails3 环境中做同样的事情,我会在这里发布

class ActionDispatch::Request
  def remote_ip
    '1.2.3.4'
  end
end

高温高压

于 2012-04-24T05:32:58.990 回答