下面的应用程序将一些数据保存到数据库中,我想测试它是否正确保存。
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由于reactor在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虽然我不确定是否为每个规范启动反应堆是一个很好的做法。帮帮忙好吗?
发布于 2012-05-05 14:32:34
问题是,在设置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。
我还没有真正测试过这个,所以如果有些东西不能工作,请告诉我,我可以进一步深入研究。
发布于 2012-08-20 05:36:00
@dj2的解决方案效果很好,但我决定在规范中使用mongo gem,而不是em-mongo。因为mongo阻塞,所以我不必担心Goliath在数据库返回结果之前停止反应器。
https://stackoverflow.com/questions/10448258
复制相似问题