2013-08-26 2 views
19

Учитывая мои потребители API необходимо отправить HTTP-клиента заголовок так:Отправка пользовательских заголовков через RSpec

# 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.

ответ

12

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

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

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

+0

Sorry - ваш ответ пришел так же, как я испытал это, как хорошо. См. Обновление. Спасибо. –

+0

Проверьте мое обновление. –

+1

Еще раз спасибо - я тоже пробовал это, и это не сработает для меня. Вы успешно протестировали это в спецификации RSpec Controller? –

22

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

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

@request нуль для меня –

+1

извините, исправлено, должно быть без @ –

+1

'request' также равно nil –

0

Пользовательские заголовки и параметры для спецификаций RSpec has changed в 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 
Смежные вопросы