鉴于我的API消费者需要发送客户HTTP标头,如下所示:
# curl -H 'X-SomeHeader: 123' http://127.0.0.1:3000/api/api_call.json
然后我可以在这样的before_filter方法中读取这个标题:
# app/controllers/api_controller.rb
class ApiController < ApplicationController
before_filter :log_request
private
def log_request
logger.debug "Header: #{request.env['HTTP_X_SOMEHEADER']}"
...
end
end
到目前为止很棒。现在我想使用RSpec测试这个,因为行为有变化:
# spec/controllers/api_controller_spec.rb
describe ApiController do
it "should process the header" do
@request.env['HTTP_X_SOMEHEADER'] = '123'
get :api_call
...
end
end
但是,ApiController中收到的request
将无法找到标头变量。
使用HTTP_ACCEPT_LANGUAGE标头尝试same code
时,它会起作用。自定义标头是否已在某处过滤?
PS:网络上的一些示例使用request
而不是@request
。虽然我不确定当前Rails 3.2 / RSpec 2.14组合中哪一个是正确的 - 但这两种方法都不会触发正确的行为,但同样也适用于HTTP_ACCEPT_LANGUAGE
。
答案 0 :(得分:23)
it 'should get profile when authorized' do
user = FactoryGirl.create :user
request.headers[EMAIL_TOKEN] = user.email
request.headers[AUTH_TOKEN] = user.authentication_token
get :profile
response.should be success
end
只需使用适当的设置调用request.headers。
答案 1 :(得分:12)
您可以直接在get
中定义它。
get :api_call, nil, {'HTTP_FOO'=>'BAR'}
我刚验证它在控制台中有效。
答案 2 :(得分:3)
RSpec请求规范changed in Rails 5,以便现在必须使用键值哈希参数定义自定义headers
和params
。 E.g:
之前进入 Rails 4 :
it "creates a Widget and redirects to the Widget's page" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/widgets", '{ "widget": { "name":"My Widget" } }', headers
expect(response).to redirect_to(assigns(:widget))
end
现在 Rails 5:
it "creates a Widget and redirects to the Widget's page" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/widgets", :params => '{ "widget": { "name":"My Widget" } }', :headers => headers
expect(response).to redirect_to(assigns(:widget))
end