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

Den*_*nny 5 session rack rspec sinatra rspec2

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

我试过了:

get "/controller/something", {}, "rack.session" => {:session => "Aa"}
Run Code Online (Sandbox Code Playgroud)

要么

get "/controller/something", {}, "session" => {:session => "Aa"}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Bat*_*ins 3

Rack 不再支持通过请求传入会话(Rack >= v1.0)。 阅读这篇文章以获取更多详细信息。

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

post '/set_sess_var/:id'
  session[:user_id] = params[:id]
end
Run Code Online (Sandbox Code Playgroud)

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

get '/get_user_attributes'
  User.find(session[:user_id]).attributes
end
Run Code Online (Sandbox Code Playgroud)

然后在测试中,您应该首先调用设置会话的路由,然后转到使用它的另一条路由。这是 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
Run Code Online (Sandbox Code Playgroud)

如果您要在测试中频繁使用该路由,那么您可以在测试文件中编写一个方法来完成此操作(如果您使用的是 Rspec,则此方法可以放在您的spec_helper.rb 或您的controller_spec 中。 rb 文件):

def set_session_var(user_id)
  post '/set_sess_var/' + user_id
end
Run Code Online (Sandbox Code Playgroud)

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

it "should print out user attributes" do
  set_session_var(1)
  get '/get_user_attributes'
  last_response.body.should == User.find(1).attributes
end
Run Code Online (Sandbox Code Playgroud)