2011-10-08 10 views
5

Po raz pierwszy pracuję z Sinatrą i po prostu nie mogę uzyskać sesji do pracy w moich testach. Mam enable :sessions w mojej aplikacji.Sinatra + Rack :: Test + Rspec2 - Korzystanie z sesji?

Próbowałem:

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

lub

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

ale nie zmienne sesyjne są ustawione na moją prośbę. Rozglądałem się po Internecie i wypróbowałem kilka sugestii, ale nic nie działa. Czy czegoś brakuje?

Dzięki!

Odpowiedz

3

Rack nie obsługuje przechodzącej w sesjach poprzez żądanie (Rack> = v1.0). Read this post for more detailed information on that.

Najlepszym sposobem na ustawienie zmiennej sesji w aplikacji jest wywołanie akcji wewnątrz aplikacji, która ustawi zmienną sesji. Na przykład, jeśli masz drogę wewnątrz aplikacji, które ustawia zmienną sesji tak:

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

Udawajmy istnieje inna trasa, która rzeczywiście chciał sprawdzić, która jest za pomocą zmiennej sesji tak:

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

Następnie w swoich testach powinieneś najpierw wywołać trasę, która ustawia sesję, a następnie przejść na inną trasę, która go używa. Oto zapis rspec, ponieważ to, co używam do testowania:

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 

Jeśli miały być często stosując drogę w badaniach, a następnie można napisać metodę do osiągnięcia tego celu w pliku testowego (jeśli używasz rspec, to metoda ta może iść w spec_helper.rb lub w pliku controller_spec.rb):

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

a następnie wywołać ją w swoich badaniach, gdy trzeba było go ustawić:

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

Nie odpowiedź, którą chciałem usłyszeć, ale myślę, że nie będę miał innego wyboru, niż przejść przez cały stos :(Dzięki, – Denny

+0

Tak, słyszę Cię, trochę irytujące, ale nie jest to zbyt trudne, jeśli stworzysz metodę, może wywoływać za każdym razem, gdy chcesz ustawić sesję, i ma na celu uczynienie szafy bardziej bezpieczną (aby ludzie nie mogli przechwycić sesji i wykuć tych, którzy nie są autoryzowani), więc robią to z dobrymi intencjami – Batkins

+0

Link Jest zepsuty. –

1

Musisz użyć klawiszy, która zakończy się w env: już

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

Nie jestem do końca pewien, czy mogę zrozum co masz na myśli. Jaka jest różnica? – Denny

+0

Przepraszam, zbyt szybko przejrzałem twoje pytanie. To powinno działać. W jakiej wersji Rack jesteś? –

+0

It's rack (1.3.4) – Denny

Powiązane problemy