我想写一些同时访问我的小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 :(得分: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