Sinatra + Rack :: Test + Rspec2 - 使用会话?

时间:2011-10-08 08:54:37

标签: session rspec sinatra rspec2 rack

这是我第一次与Sinatra合作,我无法在测试中使用会话。我的应用中有enable :sessions

我试过了:

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

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

但我的请求中没有设置会话变量。我环顾网络并尝试了几个建议,但似乎没有任何效果。我错过了什么吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

Rack不支持通过请求传递会话(Rack> = v1.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

答案 1 :(得分:1)

您需要使用最终位于env

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