RSpec: 设置请求headers
RSpec: setting request headers
我试图在我的规范中使用 ActionDispatch
request
辅助方法设置重要的 headers:
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
但是这个header(通常是任何用request
设置的header)在涉及到控制器时就消失了:
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
为什么会这样,如何正确设置?
将 header 设置为 request.header
或 @request.header
效果相同。
P.S.: 我知道我可以将 headers 设置为 Rack::Test::Methods
助手的第三个参数,但我不想违反 DRY - 我想要 Mime格式只能在那里定义。
使用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
请这样尝试:
request.env['HTTP_FOO_HEADER'] = 'foo header'
我试图在我的规范中使用 ActionDispatch
request
辅助方法设置重要的 headers:
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
但是这个header(通常是任何用request
设置的header)在涉及到控制器时就消失了:
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
为什么会这样,如何正确设置?
将 header 设置为 request.header
或 @request.header
效果相同。
P.S.: 我知道我可以将 headers 设置为 Rack::Test::Methods
助手的第三个参数,但我不想违反 DRY - 我想要 Mime格式只能在那里定义。
使用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
请这样尝试:
request.env['HTTP_FOO_HEADER'] = 'foo header'