2011-10-08 56 views
5

这是我第一次和Sinatra一起工作,而我在测试中无法获得会话。我在我的应用程序中有enable :sessionsSinatra + Rack :: Test + Rspec2 - 使用会话?

我想:

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

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

但没有会话变量在我的要求下被设置。我环顾网络,并尝试了几个建议,但似乎没有任何工作。我错过了什么吗?

谢谢!

回答

3

机架不支持通过请求传递会话了(机架> = 1.0)。 Read this post for more detailed information on that.

在您的应用程序中设置会话变量的最佳方法是在您的应用程序中调用将设置会话变量的操作。举例来说,如果你有你的应用程序内部的路由设置会话变量是这样的:

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

让我们假设有,你实际上想考这是使用另一种路由会话变量是这样的:

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

然后在你的测试中,你应该首先调用设置会话的路由,然后进入使用它的另一条路由。这里是RSpec的符号,因为这是我用来测试:

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 

如果你要经常使用您的测试路线,然后你可以写在你的测试文件来完成这个方法(如果您正在使用Rspec的,那么这种方法就可以去参加你的spec_helper.rb或在您的controller_spec.rb文件):

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

然后调用它在测试中,当你需要它来进行设置:

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

不是我想听到的答案,但我想我没有别的选择,只能通过整个堆栈:(谢谢。 – Denny

+0

是的,我听到你的。有点讨厌,但它不是很难,如果你做一个方法,你每次想要设置会话时都可以打电话,而且这样做的目的是使机架更加安全(因此人们无法截获会话并伪造未授权的会话),因此完成的目的是好的。 – Batkins

+0

链接被打破。 –

1

您需要使用将在env结束键:

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

我不太确定我和明白你的意思。有什么不同? – Denny

+0

对不起,你的问题瞥见得太快。这应该工作。你有什么样的机架版本? –

+0

It's rack(1.3.4) – Denny

相关问题