【问题标题】:Testing a Sinatra application that uses session测试使用会话的 Sinatra 应用程序
【发布时间】:2011-05-23 02:45:29
【问题描述】:

如何测试正在使用会话的 Sinatra 应用程序?

get "/", {}, {'rack.session' =>  { 'foo' => 'blah' } }

此代码对我不起作用,我的应用中有“启用 :sessions”。

【问题讨论】:

  • 你为什么不使用 session[:foo] = 'bla' ?查看 Sinatra 文档
  • 您找到解决方案了吗?我也陷入了同样的困境,我尝试了您的方式以及下面提出的解决方案。没有任何效果。

标签: testing session sinatra rack


【解决方案1】:

看起来问题实际上是激活了enable :sessions

您必须停用此设置才能覆盖会话

解决方案可能是:

# my_test.rb (first line, or at least before you require your 'my_app.rb')
ENV['RACK_ENV'] = 'test'

# my_app.rb (your sinatra application)
enable :sessions  unless test?

# my_test.rb (in your test block)
get '/', {}, 'rack.session' => { :key => 'value' }

另一方面,为了能够检查 action 预期进行的任何 session 更改,我们可以不发送 hashrack.session 是一个 指向哈希的指针,所以我们可以在 action 调用之后检查 hash 是否有改变:

# my_test.rb (in your test block)
session = {}
get '/', {}, 'rack.session' => session
assert_equal 'value', session[:key]

【讨论】:

  • 这对我不起作用,使用 Sinatra 1.2。我知道这个答案已经 7 个月大了,你找到其他解决方案了吗?
【解决方案2】:

刚刚遇到这个问题,解决方案只是要求文件的顺序,所以@fguillen 是正确的。在你的规范的顶部,确保你需要在你的 sinatra 应用程序之前进行机架/测试,所以至少,这应该让你开始:

# in myapp_spec.rb
require 'rspec'
require 'rack/test'
require 'myapp'

it "should set the session params" do
  get 'users/current/projects', {}, 'rack.session' => {:user =>'1234'}
end

# in myapp.rb

enable :sessions

get 'users/current/projects' do
  p env['rack.session']
end

【讨论】:

    【解决方案3】:

    就像 Philip 建议的那样,在获取请求之前手动设置会话变量会更好。

    session[:foo] = 'blah'
    get "/"
    

    【讨论】:

    • NameError: undefined local variable or method 'session'
    【解决方案4】:

    我终于通过猴子补丁Rack::Test::Session弄明白了:

    https://gist.github.com/troelskn/5047135

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多