RSpec:设置请求标头

时间:2016-02-18 19:38:13

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

我尝试在我的规范中使用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设置标题也是一样的。

PS:我知道我可以将标题设置为Rack::Test::Methods助手的第三个参数,但我不想违反DRY - 我只想在那里定义Mime格式。< / p>

2 个答案:

答案 0 :(得分:6)

请尝试这样:

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

答案 1 :(得分:0)

使用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