2014-04-03 16 views
7

Come posso impostare le intestazioni di richiesta prima di fare la richiesta su una specifica di richiesta?Accesso all'oggetto di richiesta nelle specifiche di richiesta

Sto spostando le specifiche del controller per richiedere le specifiche sulla mia API utilizzando Rails. Una cosa su cui sono bloccato è che non ho accesso a un oggetto request per consentire le richieste.

Il mio specifiche del controller, ho accesso a un metodo che ho creato, che firma un utente specifico:

def sign_in(user) 
    token = user.api_keys.first.token 
    # note the request object being used in the next line 
    request.env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Token.encode_credentials(token) 
end 

Questo funziona bene su specifiche del controller, posso tranquillamente fare:

before { sign_in(user) } 
it { post :endpoint, params } 

Ma su una specifica della richiesta, l'oggetto request non è disponibile. Se provo a:

before { sign_in(user) } 
it { post "/api/endpoint", params } 

ottengo request sul mio metodo di supporto come nil.

So che potrei fare:

it { post "/api/endpoint", {"HTTP_AUTHORIZATION" => ... } } 

ma questo sembra un sacco di confusione nelle specifiche, specialmente rispetto ad una specifica di controllo.

Ho provato a utilizzare ActionDispatch::TestRequest::DEFAULT_ENV come suggerito da this answer, ma non ha funzionato troppo (ho ottenuto un 401).

risposta

2

Se non stai già utilizzando Rack::Test per questo allora dovresti esserlo. Rack::Test è più adatto di Capybara per testare le richieste API. Può essere configurato in rspec/spec_helper.rb

RSpec.configure do |config| 
    # ... 
    config.include Rack::Test::Methods 
end 

Quando hai configurato per utilizzare Rack :: Test, è possibile impostare le intestazioni prima che la richiesta in questo modo:

it 'POST /api/enpoint authenticates successfully' do 
    header 'Authorization', '...' 
    post "/api/endpoint", params 
    expect(last_response).to be_ok 
end 

Questo sarà accessibile nel controller come request.headers['HTTP_AUTHORIZATION'].

Il codice sorgente per questo metodo può essere trovato qui - https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb#L127-L141

+0

Grande, grazie! –

+0

Questo è specificato nella documentazione di rspec dovunque? –

-1

Se si utilizza capybara per le specifiche di richiesta, suppongo che tu possa impostare le intestazioni come suggerito here, tuttavia è meglio eseguire il vero accesso tramite il modulo HTML o qualunque sia il modo di autenticarsi nella tua app, perché specifica richiesta sono più alti di quelli del controller, ed è per questo che normalmente non ti permettono di impostare manualmente intestazioni, cookie e altri contenuti di basso livello.

+0

Questa è un'API, che emette solo JSON, non qualcosa che l'utente finale interagisce con. –

Problemi correlati