2013-08-26 17 views
19

Biorąc pod uwagę moje konsumenci API są wymagane, aby wysłać nagłówek HTTP klient takiego:Wysyłanie niestandardowe nagłówki przez RSpec

# curl -H 'X-SomeHeader: 123' http://127.0.0.1:3000/api/api_call.json 

Wtedy mogę przeczytać ten nagłówek w sposobie before_filter tak:

# 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 

Jak dotąd świetnie. Teraz chciałbym przetestować to przy użyciu rspec jak nastąpiła zmiana w zachowaniu:

# 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 

Jednak request otrzymał w ApiController nie będzie w stanie znaleźć zmienną cel.

Podczas próby same code z nagłówkiem HTTP_ACCEPT_LANGUAGE będzie działać. Czy niestandardowe nagłówki są odfiltrowane?

PS: Niektóre przykłady w Internecie używają request zamiast @request. Chociaż nie jestem pewien, który z nich jest poprawny, jak w obecnej kombinacji Rails 3.2/RSpec 2.14 - obie metody nie wywołają właściwego zachowania, ALE oba działają również z HTTP_ACCEPT_LANGUAGE.

Odpowiedz

12

Możesz to zdefiniować bezpośrednio w get.

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

Właśnie sprawdziłem, czy działa w konsoli.

+0

Sorry - odpowiedź przyszła tak jak ja testowałem to za dobrze. Zobacz aktualizację. Dziękuję Ci. –

+0

Sprawdź moją aktualizację. –

+1

Jeszcze raz dziękuję - próbowałem tego również i to nie zadziała dla mnie. Czy pomyślnie przetestowałeś to w specyfikacji kontrolera RSpec? –

22

dobrze, może być za późno dla ludzi, ale po prostu być w kolejce:

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 

zadzwoń request.headers z odpowiednimi ustawieniami.

+1

@request is nil dla mnie –

+1

przykro nam, naprawiony, powinien być bez @ –

+1

'request' jest również zerowy –

0

Niestandardowe nagłówki i parametry dla specyfikacji żądania RSpec has changed w Rails 5, tak aby wyraźnie podać headers i params. Np .:

Przed w 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 

teraz 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 
Powiązane problemy