首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sinatra + Rack::Test + Rspec2 -使用会话?

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

Stack Overflow用户
提问于 2011-10-08 16:54:37
回答 2查看 2.4K关注 0票数 5

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

我试过了:

代码语言:javascript
复制
get "/controller/something", {}, "rack.session" => {:session => "Aa"}

代码语言:javascript
复制
get "/controller/something", {}, "session" => {:session => "Aa"}

但是在我的请求中没有设置会话变量。我浏览了一下网页,尝试了几个建议,但似乎都不起作用。我是不是遗漏了什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-18 04:14:48

Rack不再支持通过请求传入会话(Rack >= v1.0)。Read this post for more detailed information on that.

在应用程序中设置会话变量的最佳方法是在应用程序内部调用将设置会话变量的操作。例如,如果您的应用程序中有一个设置会话变量的路由,如下所示:

代码语言:javascript
复制
post '/set_sess_var/:id'
  session[:user_id] = params[:id]
end

让我们假设您实际上想要测试的另一条路径是使用如下所示的会话变量:

代码语言:javascript
复制
get '/get_user_attributes'
  User.find(session[:user_id]).attributes
end

然后在您的测试中,您应该首先调用设置会话的路由,然后转到另一个使用它的路由。下面是rspec表示法,因为这是我用来测试的:

代码语言:javascript
复制
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文件中使用此方法):

代码语言:javascript
复制
def set_session_var(user_id)
  post '/set_sess_var/' + user_id
end

然后在你需要设置的时候在你的测试中调用它:

代码语言:javascript
复制
it "should print out user attributes" do
  set_session_var(1)
  get '/get_user_attributes'
  last_response.body.should == User.find(1).attributes
end
票数 3
EN

Stack Overflow用户

发布于 2011-10-09 01:00:32

您需要使用将在env中结束的密钥

代码语言:javascript
复制
get "/controller/something", {}, "rack.session" => {:session => "Aa"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7695775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档