0

この以下のアプリはいくつかのデータをデータベースに保存します。正しく保存されることをテストしたいと思います。

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

すべての仕様でリアクターを起動することが良い習慣かどうかはわかりませんが。助けてください?

4

2 に答える 2

1

問題は、get_requestがセットアップされるときに、イベントループを停止するコールバックをリクエストに追加することです。したがって、ブロックが終了するとすぐに(接続が作成される前になります)、reactorが停止します。

最善の解決策はわかりませんが、厄介な解決策は次のようにオーバーライドすることです。

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-05-05T06:32:33.810 に答える
0

@ dj2のソリューションはうまく機能しますがmongo、スペックでgemを使用する代わりに、を使用することにしましem-mongoた。ブロックなのでmongo、データベースが結果を返す前にゴリアテがリアクターを停止することを心配する必要はありません。

于 2012-08-19T21:35:59.940 に答える