Sinatra测试会话和并发访问

时间:2012-10-19 15:16:52

标签: ruby session sinatra rack

我想写一些同时访问我的小sinatra应用程序的测试。

这里的问题是,我使用会话(通过Rack :: Session :: Pool)。我无法弄清楚如何让机架测试产生新的会话。当我在我的请求中注入会话数据时,我总是以一个会话结束。所以我基本上一次只能有一个会话。

在我的测试中,我尝试了以下内容:

threads = []
2.times do |index|
  threads << Thread.new do
    get "/controller/something", {}, "rack.session" => {:id => "Thread#{index}"}
    post "/do_action"
  end
end
thrads.each{|t| t.join}

是否存在某种“浏览器层,我可以拥有多个实例”?

编辑:对不起,我必须澄清一下:线程示例只是一个疯狂的猜测,以获得一个新的会话。它没用。所以我只想找到一种在runnin(测试)服务器上打开多个会话的方法。在开发模式中,我可以打开一个新的浏览器会话来实现这样的功能。在测试模式中,我现在迷路了。

1 个答案:

答案 0 :(得分:1)

这是一个使用MiniTest和Spec语法扩展的工作示例。

# using MiniTest::Spec extensions
# http://bfts.rubyforge.org/minitest/MiniTest/Spec.html

describe 'Fun with Sinatra and multiple sessions' do
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  it "does some stuff with multiple sessions" do
    sess1 = Rack::Test::Session.new(Rack::MockSession.new(app))
    sess2 = Rack::Test::Session.new(Rack::MockSession.new(app))
    sess1.wont_equal sess2

    sess1.get '/' # or whatever
    sess1.last_response.must_equal :ok?

    sess2.get '/' # or whatever
    sess2.last_response.must_equal :ok?
  end

  it "this does the same thing" do
    sess2 = Rack::Test::Session.new(Rack::MockSession.new(app))

    get '/' # or whatever
    last_response.must_equal :ok?

    sess2.get '/' # or whatever
    sess2.last_response.must_equal :ok?

  end

end