【问题标题】:RSpec: setting request headersRSpec:设置请求标头
【发布时间】:2016-02-18 19:38:13
【问题描述】:

我正在尝试在我的规范中使用 ActionDispatch request 辅助方法设置重要的标题:

RSpec.describe API::V1::FoosController, type: :request do
  describe 'GET #index' do
    context 'common case' do
      request.env.merge!({'HTTP_FOO': 'FOO'})
      get api_foos_path, {}, {Accept: Mime::JSON}
    end
  end
end

但是当涉及到控制器时,此标头(以及通常使用request 设置的任何标头)会消失:

class API::V1::FoosController < ApplicationController
  respond_to :json, :xml

  def index
    request.env.has_key? 'HTTP_FOO' # false
    respond_with serialize_models(Foo.all)
  end
  # ...
end

为什么会发生,我该如何正确设置? 使用request.header@request.header 设置标题也是如此。

P.S.:我知道我可以将标题设置为 Rack::Test::Methods 助手的第三个参数,但我不想违反 DRY - 我希望仅在此处定义 Mime 格式。

【问题讨论】:

    标签: ruby-on-rails ruby rspec rspec-rails


    【解决方案1】:

    请尝试这样:

    request.env['HTTP_FOO_HEADER'] = 'foo header'
    

    【讨论】:

    • 不幸的是,以不同的方式添加环境键/值并没有改变。
    • 我用rspec 3.3.0rails 4.2.5.1 测试了这段代码sn-p。它有效。
    • 您是否使用控制器规格对其进行了测试?
    • 是的,我用控制器测试过。
    • 它不适用于请求的,请参阅 cmets 以获取上面的答案。
    【解决方案2】:

    使用controller.request.headers:

    controller.request.headers['HTTP_FOO'] = 'FOO'
    

    我可以验证这种方法在 Rails 4.2.5 中是否有效,因为这是直接从实际代码中提取的。

    我们的测试如下所示:

    describe SomeController, type: :controller do
      let(:current_user) { create :user }
    
      before :each do
        controller.request.headers['Authorization'] = "APIKey #{current_usser.api_key}"
      end
    end
    

    我们的ApplicationController 看起来(或多或少)是这样的:

    before_action :authenticate_request
    
    def authenticate_request
      key = request.headers['Authorization']
      user = User.find_by(api_key: key)
      # raise AuthenticationError unless user, etc etc
    end
    

    【讨论】:

    • 我也使用 Rails 4.2.5,但是……它不行。你用的是哪个版本的 rack,rspec-core?
    • @DreamWalker gem 'rspec-rails', '~&gt; 3.0',机架 1.6.4
    • 我的是rspec-core-3.0.4rspec-rails-3.0.2rack的相同版本,你能提供一段代码,这种方法适用吗?
    • @DreamWalker 查看更新。可能是您的规范中缺少type: :controller
    • 你是对的 - 区别在于规格类型,它适用于 controller 规格,但不适用于 request 规格。反过来,控制器规格还有许多其他警告:( 无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多