2012-10-19 43 views
1

我想写一些测试,同时访问我的小sinatra应用程序。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(测试)服务器上打开多个会话。在开发模式下,我可以打开一个新的浏览器会话来实现这样的事情。在测试模式下,我目前失去了。

+0

@leify什么是你要能与麒麟.sorry正确的做,如果我错了西纳特拉上的WEBrick和使用WEBrick基本上是单一线程工作,所以我没有看到这种事情发生纠正我,如果我错了 – Viren

+0

这可能是对的,但它与问题无关。线程示例来自客户端。即使服务器只有一个线程,它也应该能够管理多个会话。 – leifg

回答

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