如何在 Rspec helper 中模拟 remote_ip?

12
我有一个helper spec,内容如下: expect(request).to receive(:remote_ip).and_return('1.2.3.4') 运行测试时,测试通过了,但出现了警告:
警告:在nil上设置了 :remote_ip 的期望。要允许在 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个回答

11

您可以在方法参数中使用 env 键,该键将包含 "REMOTE_ADDR" 键:

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

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

这将解决您的问题。不过,如果您在控制器的私有方法中使用了该ip,则可以查看 此链接:


2

回答

你可以使用 controller.request.remote_addr = '1.2.3.4' 在助手中设置remote_ip

示例

助手文件:

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

说明

Helper规范混合了ActionView::TestCase::Behavior。这提供了一个helper对象,它将被规范的辅助模块与ApplicationHelper混合在一起。(在这种情况下,被规范的模块是ApplicationHelper)。

当执行helper规范时,它会将controller对象设置为ActionView::TestCase::TestController。此测试控制器上的request对象是ActionController::TestRequest

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接