2013-08-26 8 views
19

meine API Verbraucher Gegeben sind verpflichtet, einen Kunden-HTTP-Header wie folgt an:Senden benutzerdefinierte Header durch RSpec

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

Dann kann ich diesen Header in einem before_filter Methode wie folgt lesen:

# 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 

Soweit großartig. Nun würde Ich mag diese mit RSpec testen, da es eine Änderung im Verhalten ist:

# 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 

jedoch die request in ApiController empfing nicht in der Lage sein, die Header-Variable zu finden.

Wenn Sie die same code mit dem Header HTTP_ACCEPT_LANGUAGE versuchen, wird es funktionieren. Werden benutzerdefinierte Header irgendwo gefiltert?

PS: Einige Beispiele im Internet verwenden request statt @request. Während ich nicht sicher bin, welches ist korrekt als der aktuellen Rails 3.2/RSpec 2.14 Kombination - beide Methoden werden nicht das richtige Verhalten auslösen, aber beide arbeiten mit HTTP_ACCEPT_LANGUAGE als auch.

Antwort

12

Sie können es in get direkt definieren.

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

Ich überprüfte es einfach in der Konsole arbeitet.

+0

Sorry - Ihre Antwort kam in genau wie ich dies auch getestet. Bitte beachten Sie das Update. Vielen Dank. –

+0

Überprüfen Sie mein Update. –

+1

Nochmals vielen Dank - Ich habe es auch versucht und es wird nicht für mich arbeiten. Haben Sie dies erfolgreich in einer RSpec Controller-Spezifikation getestet? –

22

gut, vielleicht zu spät für Menschen, sondern nur aufgereiht werden:

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 

nur request.headers mit entsprechenden Einstellungen aufrufen.

+1

@request ist null für mich –

+1

Sorry, behoben, sollte ohne sein @ –

+1

'Anfrage' ist auch Null –

0

Benutzerdefinierte Header und Parameter für RSpec-Anforderungsspezifikationen has changed in Rails 5, so dass headers und params explizit angegeben werden müssen. Z.B .:

Bevor in 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 

Jetzt für 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 
Verwandte Themen