如何测试em-mongo + 歌利亚



下面的应用程序将一些数据保存到数据库中,我想测试它是否正确保存。

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

虽然我不确定为每个规格启动反应堆是否是一种好的做法。请帮忙?

问题是,当设置get_request时,我们会在停止事件循环的请求上添加一个回调。因此,一旦您的块完成(甚至在创建连接之前),它将停止反应堆。

我不确定最好的解决方案,但一个蹩脚的解决方案是覆盖:

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

在包含 Goliath::TestHelper 之后的测试类中。然后,我认为,你应该能够编写自己的内容,如下所示:

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

你只需要确保在Mongo的回调中调用停止。

我还没有实际测试过这个,所以如果有什么地方不起作用,请告诉我,我可以进一步挖掘。

@dj2的解决方案效果很好,但我决定不在规格中使用mongo gem,而不是em-mongo .由于mongo块,我不必担心歌利亚在数据库返回结果之前停止反应堆。

相关内容

  • 没有找到相关文章