2012-05-04 31 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。原因是随机规格在没有任何原因的情况下会失败,可能是因为断言在数据库命令执行之前就会完成。 –