Как проверить Эм-Монго + Голиаф?
Это приложение ниже сохраняет некоторые данные в БД, и я хочу проверить, правильно ли оно сохраняется.
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 ответа
Проблема в том, что когда настройка 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
Вам просто нужно будет убедиться, что вы перезвоните в обратном вызове из Монго.
Я на самом деле не проверял это, поэтому дайте мне знать, если что-то не работает, и я могу копаться дальше.
Решение @dj2 прекрасно работает, но я решил вместо использования mongo
жемчужина в спецификациях, а не em-mongo
, поскольку mongo
блоки, мне не нужно беспокоиться о том, что Голиаф остановит реактор до того, как база данных вернет результаты.