Как проверить Эм-Монго + Голиаф?

Это приложение ниже сохраняет некоторые данные в БД, и я хочу проверить, правильно ли оно сохраняется.

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 блоки, мне не нужно беспокоиться о том, что Голиаф остановит реактор до того, как база данных вернет результаты.

Другие вопросы по тегам