如何在Rspec助手中模拟出remote_ip?

时间:2016-05-10 18:29:35

标签: ruby-on-rails ruby rspec

我有一个帮助规范说明如下: expect(request).to receive(:remote_ip).and_return('1.2.3.4')

运行测试,他们通过,但发出警告:

警告::remote_ip上设置了nil的预期值。要允许nil的期望并取消此消息,请将config.allow_expectations_on_nil设置为true。要禁止nil的期望,请将config.allow_expectations_on_nil设置为false

我尝试过使用helper.request和controller.request,但测试失败了:undefined method remote_ip for nil:NilClass

你如何模拟你的IP地址?

3 个答案:

答案 0 :(得分:2)

您可以对包含"REMOTE_ADDR"键的方法参数使用env键:

post path, params: params, env: { "REMOTE_ADDR": your_desired_ip }

答案 1 :(得分:1)

答案

您可以使用by(BOE.1Data$Distance.cm, BOE.1Data$Day, mean) 在帮助程序中设置remote_ip

示例

帮助文件:

controller.request.remote_addr = '1.2.3.4'

规范文件:

module ApplicationHelper
  def ip
    request.remote_ip
  end
end

说明

帮助器规格混合在require 'rails_helper' RSpec.describe ApplicationHelper, type: :helper do describe '#ip' do it 'returns the IP' do controller.request.remote_addr = '1.2.3.4' expect(helper.ip).to eql '1.2.3.4' end end end 中。这提供了一个ActionView::TestCase::Behavior对象,它与指定的helper模块以及helper混合在一起。 (在这种情况下,规范的模块是ApplicationHelper)。

执行辅助规范时,将ApplicationHelper对象设置为controller。此测试控制器上的ActionView::TestCase::TestController对象为request

在测试请求上使用ActionController::TestRequest setter,在#remote_addr=实例变量中设置"REMOTE_ADDR"键。 @env使用remote_ip实例变量中的相同"REMOTE_ADDR"键来检索IP。

答案 2 :(得分:1)

before do
  request.env['REMOTE_ADDR'] = '59.152.62.114'
end

这将解决您的问题。但是,如果您在控制器的私有方法中使用了ip,则可以检出this link: