1

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

这里的问题是,我使用会话(通过 Rack::Session::Pool)。我不知道如何让 rack-test 产生一个新会话。当我在请求中注入会话数据时,我总是以一个会话结束。所以我基本上一次只能有1个会话。

在我的测试中,我尝试了以下方法:

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}

是否有某种“我可以有多个实例的浏览器层”?

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

4

1 回答 1

1

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

# 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
于 2014-01-03T02:54:41.420 回答