20

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

但是,request在 ApiController 中接收到的将无法找到 header 变量。

尝试same code使用 HTTP_ACCEPT_LANGUAGE 标头时,它将起作用。自定义标题是否在某处过滤?

PS:网络上的一些示例使用request而不是@request. 虽然我不确定在当前的 Rails 3.2/RSpec 2.14 组合中哪一个是正确的——这两种方法都不会触发正确的行为,但两者都可以使用HTTP_ACCEPT_LANGUAGE

4

3 回答 3

25

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

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 即可。

于 2014-05-13T15:15:55.930 回答
12

可以get直接定义。

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

我刚刚验证它在控制台中工作。

于 2013-08-26T07:01:14.400 回答
7

RSpec 请求规范在 Rails 5 中发生了变化,因此现在必须使用键值哈希参数定义自定义headers和。params例如:

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
于 2017-12-22T22:42:21.220 回答