通过RSpec发送自定义标头

鉴于我的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

好吧,对于人们来说可能为时已晚,但只是为了排队:

 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。

您可以直接在get定义它。

 get :api_call, nil, {'HTTP_FOO'=>'BAR'} 

我刚刚validation它在控制台中工作。

Rails 5中的 RSpec请求规范已更改,因此现在必须使用键值哈希参数定义自定义headers和参数。 例如:

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