2012-05-04 2 views
0

아래 응용 프로그램은 일부 데이터를 db에 저장하므로 제대로 저장하는지 테스트하고 싶습니다. 반응기 callback 돌아 가기 전에 끝나는 때문에em-mongo + Goliath를 테스트하는 방법은 무엇입니까?

require 'goliath' 

class App < Goliath::API 
    def response(env) 
    db = EM::Mongo::Connection.new('localhost').db('hello') 
    db.collection('coll').insert({'identifier => 1'}) 

    [204, {}, {}] 
    end 
end 

require 'goliath/test_helper'  
Goliath.env = :test 

describe App do 
    include Goliath::TestHelper 

    it do 
    with_api(described_class) do 
     get_request do |req| 
     db = EM::Mongo::Connection.new('localhost').db('hello') 
     db.collection('coll').first.callback do |rec| 
      rec['identifier'].should == 100 
     end 
     end 
    end 
    end 
end 

상기 스펙 통과한다. 모든 사양에 대한 반응을 시작하는 것이 좋습니다 경우 잘 모르겠어요하지만

EM.run do 
    db = EM::Mongo::Connection.new('localhost').db('hello') 
    db.collection('coll').first.callback do |rec| 
    rec['identifier'].should == 100 

    EM.stop 
    end 
end 

: 나는 약을 수동으로 같은 반응을 시작 생각했다. 도와주세요?

답변

1

get_request가 설정되면 이벤트 루프를 중지시키는 요청에 콜백을 추가하는 것이 문제입니다. 따라서 블록이 완료 되 자마자 (연결이 만들어지기 전에) 반응기가 정지합니다.

나는 최선의 해결책 모르겠지만, 시시한 사람은 무시하는 것입니다 : 테스트 클래스

def hookup_request_callbacks(req, errback, &blk) 
    req.callback &blk 
    req.callback { stop } 

    req.errback &errback if errback 
    req.errback { stop } 
end 

당신이 골리앗 :: TestHelper을 포함 후. 당신은 당신이 몽고에서 콜백에 정지를 호출 있는지 확인해야합니다

def hookup_request_callbacks(req, errback, &blk) 
    req.callback &blk 

    req.errback &errback if errback 
    req.errback { stop } 
end 

: 그럼, 생각, 당신은 단지 같은 것을 가지고 직접 작성 할 수 있어야한다.

나는 실제로 이것을 테스트하지 않았기 때문에, 어떤 것이 작동하지 않는 경우 알려 주시면 더 자세히 조사 할 수 있습니다.

+0

그게 효과가 있습니다. 관련없는 메모에서, 귀하의 블로그에서 많은 것을 배웠습니다. –

0

@ dj2의 해결책은 훌륭하지만, em-mongo 대신에 mongo 보석을 사용하는 대신에 결정했습니다. mongo 블록 이후로, 데이터베이스 결과가 반환되기 전에 골리앗이 원자로를 멈추지 않을까 걱정하지 않아도됩니다.

+0

지금 'mongo'(어느 블록)를 사용하고 있다면, 비동기식 원자로 패턴으로 인해 많은 수의 EventMachine의 약속을 포기하지 않으시겠습니까? – vaiomike

+0

정규 mongo를 사양으로 만 사용하고 있습니다. 그 이유는 아무 이유없이 임의의 스펙이 실패하기 전에 였기 때문일 것입니다. 아마도 데이터베이스에 대한 명령이 실행되기 전에 어설 션이 완료되기 때문입니다. –