【问题标题】:How do i set a request.referrer inside my RSpec?如何在我的 RSpec 中设置 request.referrer?
【发布时间】:2012-09-25 22:04:40
【问题描述】:

我试图避免使用我的session[:referred_by],并希望使用request.referrer。但是,我的 RSpec 测试失败了,因为 TestRequest 没有存储 request.referrer

所以我必须执行以下操作才能使 Rspec 测试正常工作。有没有办法让它变得更好:

referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    ActionDispatch::TestRequest 扩展 ActionDispatch::Request 扩展 Rack::Request

    方法定义如下

    def referer
      @env['HTTP_REFERER']
    end
    alias referrer referer
    

    据我所知,您可以使用request.env 访问RSpec 测试中的环境变量。这意味着,应该可以设置类似的东西

    request.env['HTTP_REFERER'] = 'http://example.com'
    

    当然,这取决于您使用的 RSpec 示例组的类型。

    【讨论】:

    • request.env['HTTP_REFERER'] = 'http://example.com' 为我工作。 Rspec 版本是 3.4.4
    【解决方案2】:

    模拟它:

    specify 'foo' do
      controller.request.should_receive(:referer).and_return('http://example.com')
      # get whatever
    end
    

    或者如果你不在乎它是否没有被调用,那就存根它:

    controller.request.stub referer: 'http://example.com'
    

    【讨论】:

    • Simone Carletti 的答案更简洁,因为它可以处理referer/referrer 的两种拼写方式
    【解决方案3】:

    在 Rails 5 上,公认的解决方案似乎不再有效,但直接设置 request.env['HTTP_REFERER'],正如 Simone Carletti 建议的那样,有效。

    【讨论】:

      【解决方案4】:

      Rails 5.2+ & RSpec 3.8+ 解决方案

      get :endpoint, params: {}, headers: { 'HTTP_REFERER' => 'stackoverflow.com' }
      

      【讨论】:

      • 如果headers已经存在(通常用于认证),我们可以合并它们:headers: headers.merge( { 'HTTP_REFERER' => 'stackoverflow.com' } )
      • @Lucas Caton 不适合我。 ArgumentError: unknown keyword: headers
      【解决方案5】:

      对于 Rails4/Rspec3,在请求规范中,request 在您进行 http 调用之前不可用。但是您可以通过执行以下操作来分配 request.referer:

      get '/posts', {}, { referer: 'http://example.com' }
      

      【讨论】:

        【解决方案6】:

        这也适用于控制器规范:

        controller.request.headers.merge({ 'HTTP_REFERER': 'https://stackoverflow.com/' })
        get(:endpoint)
        

        【讨论】:

          【解决方案7】:

          对于其他在谷歌上搜索的人,您还可以像这样在帮助规范中存根请求:

          allow(view).to receive_message_chain(:request, :referrer).and_return("http://example.com")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-17
            • 1970-01-01
            • 2013-01-22
            • 1970-01-01
            • 2013-05-26
            • 1970-01-01
            相关资源
            最近更新 更多