Подтвердить что ты не робот

Отправка пользовательских заголовков через 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

Однако request, полученный в ApiController, не сможет найти переменную заголовка.

При попытке same code с заголовком HTTP_ACCEPT_LANGUAGE он будет работать. Где-то фильтруются пользовательские заголовки?

PS: Некоторые примеры использования в Интернете request вместо @request. Хотя я не уверен, какая из них правильна в отношении текущей комбинации Rails 3.2/RSpec 2.14 - оба метода не будут приводить к правильному поведению, но оба работают с HTTP_ACCEPT_LANGUAGE.

4b9b3361

Ответ 1

ну, может быть, слишком поздно для людей, но просто нужно выстроить:

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 с соответствующими настройками.

Ответ 2

Вы можете определить его непосредственно в get.

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

Я просто проверил, что он работает в консоли.

Ответ 3

Пользовательские заголовки и параметры для спецификаций запроса RSpec изменились в Rails 5, так что headers и params должны быть указаны явно, Например:.

До в Rails 4:

it "creates a Widget and redirects to the Widget 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 page" do
  headers = { "CONTENT_TYPE" => "application/json" }
  post "/widgets", :params => '{ "widget": { "name":"My Widget" } }', :headers => headers
  expect(response).to redirect_to(assigns(:widget))
end