2012-05-04 48 views
0

這下面的應用程序將一些數據保存到數據庫,我想測試它保存正確。如何測試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 

上述規格自從callback返回前反應器結束。我想過手動啓動反應器,如:

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

這樣做,thx!在一個不相關的說明中,從你的博客中學到了很多,thx! –

0

@ dj2的解決方案效果很好,但我決定在規格中使用mongo寶石,而不是em-mongo。由於mongo塊,我不必擔心Goliath在數據庫返回結果之前停止反應堆。

+0

如果你現在使用'mongo'(哪個塊),你會不會放棄很多EventMachine的承諾(即由於異步反應器模式造成的超高可伸縮性)? – vaiomike

+0

我只在規格中使用普通的mongo。原因是隨機規格在沒有任何原因的情況下會失敗,可能是因爲斷言在數據庫命令執行之前就會完成。 –