2011-10-08 17 views
5

È la prima volta che lavoro con Sinatra e non riesco a far funzionare le sessioni nei miei test. Ho enable :sessions nella mia app.Sinatra + Rack :: Test + Rspec2 - Utilizzo delle sessioni?

ho provato:

get "/controller/something", {}, "rack.session" => {:session => "Aa"} 

o

get "/controller/something", {}, "session" => {:session => "Aa"} 

Ma nessun variabili di sessione vengono impostati nella mia richiesta. Ho cercato sul Web e provato diversi suggerimenti, ma niente sembra funzionare. Mi sto perdendo qualcosa?

Grazie!

risposta

3

rack non supporta il passaggio nelle sessioni tramite la richiesta di più (Rack> = v1.0). Read this post for more detailed information on that.

Il modo migliore per impostare una variabile di sessione nell'app è chiamare un'azione all'interno dell'applicazione che imposterà la variabile di sessione. Per esempio, se si dispone di un percorso all'interno della vostra app che imposta una variabile di sessione come questo:

post '/set_sess_var/:id' 
    session[:user_id] = params[:id] 
end 

Facciamo finta c'è un altro percorso che in realtà voleva mettere alla prova che sta usando la variabile di sessione in questo modo:

get '/get_user_attributes' 
    User.find(session[:user_id]).attributes 
end 

Quindi nei test, è necessario prima chiamare il percorso che imposta la sessione, quindi andare su un'altra rotta che lo utilizza. Ecco la notazione RSpec, dato che questo è quello che io uso per la prova:

it "should print out user attributes" do 
    user_id = 1 
    post '/set_sess_var/' + user_id 
    get '/get_user_attributes' 
    last_response.body.should == User.find(user_id).attributes 
end 

Se si dovesse andare di utilizzare il percorso di frequente nei test, quindi si potrebbe scrivere un metodo per raggiungere questo obiettivo nel vostro file di prova (se stai usando Rspec, allora questo metodo potrebbe andare nel vostro spec_helper.rb o nel file controller_spec.rb):

def set_session_var(user_id) 
    post '/set_sess_var/' + user_id 
end 

e quindi chiamare in vostri test quando si aveva bisogno di essere impostato:

it "should print out user attributes" do 
    set_session_var(1) 
    get '/get_user_attributes' 
    last_response.body.should == User.find(1).attributes 
end 
+0

Non è la risposta che volevo sentire, ma immagino che non avrò altra scelta che passare attraverso l'intero stack :(Grazie. – Denny

+0

Sì, ti sento. Un po 'fastidioso ma non è troppo difficile se fai un metodo che può chiamare ogni volta che si desidera impostare la sessione, ed è fatto allo scopo di rendere Rack più sicuro (in modo che le persone non possano intercettare la sessione e forgiare chi non è autorizzato), quindi è fatto con buone intenzioni Link – Batkins

+0

è rotta. –

1

è necessario utilizzare i tasti che finiranno in env:

get "/controller/something", {}, "rack.session" => {:session => "Aa"} 
+0

Non sono abbastanza sicuro che io cosa vuoi dire? Qual è la differenza? – Denny

+0

Scusa, ho intravisto troppo velocemente la tua domanda. Questo dovrebbe funzionare. In quale versione di Rack sei? –

+0

È il rack (1.3.4) – Denny

Problemi correlati