如何测试em-mongo + Goliath?

时间:2012-05-04 11:48:02

标签: ruby mongodb asynchronous eventmachine 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

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

2 个答案:

答案 0 :(得分: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
在包含Goliath :: TestHelper之后,在您的测试类中

。然后,我认为,你应该能够编写自己的东西,例如:

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

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

你必须确保在Mongo的回调中调用stop。

我实际上没有测试过这个,所以如果有什么不行的话请告诉我,我可以深入研究。

答案 1 :(得分:0)

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