2012-10-19 2 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

내가 틀렸다면 그 해프닝이 날 수정보고 해달라고 그래서 나는시나가에 WEBrick과에 WEBrick는 기본적으로 단일 스레드입니다 작업 틀렸다면 – Viren

+0

그럴 수도 있지만 문제와는 아무런 관련이 없습니다. 스레딩 예제는 클라이언트 측의 예제입니다. 서버에 하나의 스레드 만 있으면 여러 세션을 관리 할 수 ​​있어야합니다. – leifg

답변

1

다음은 SpecText 확장으로 MiniTest를 사용하는 작동 예제입니다. 당신이 그 유니콘 그렇군 애도 올바른 수행 할 수 있습니다 원하는 무엇 @leify

# 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 
관련 문제