1

noseを使用して、twistedとtxmongoを使用して作成しているアプリケーションをテストしたいと思います。次のような単純なユースケースも取得できません。nose.twistedtoolsからインポートreactor、deferred、threaded_reactorインポートログからtwisted.internet import defer import txmongo

log = logging.getLogger("common.test.test_db")

conn = txmongo.lazyMongoConnectionPool('localhost', 27017, 4)

@deferred()
def test_mongo():
    tdb = conn.test

    @defer.inlineCallbacks
    def cb(oid):
        assert oid
        obj = yield tdb.test.find({"_id":oid})
        log.error("In callback")
        assert obj 

    d = tdb.test.save({"s":1, "b":2})
    d.addCallback(cb)

    return d

ただし、これは常に次を返します。

E
======================================================================
ERROR: common.test.test_db.test_mongo
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Volumes/Users/jce/.pyenv/celery/lib/python2.6/site-packages/nose/case.py", line 186, in runTest
    self.test(*self.arg)
  File "/Volumes/Users/jce/.pyenv/celery/lib/python2.6/site-packages/nose/twistedtools.py", line 138, in errback
    failure.raiseException()
  File "/Volumes/Users/jce/.pyenv/celery/lib/python2.6/site-packages/twisted/python/failure.py", line 326, in raiseException
    raise self.type, self.value, self.tb
RuntimeWarning: not connected

----------------------------------------------------------------------
Ran 1 test in 0.006s

FAILED (errors=1)

threaded_reactor()呼び出しを手動で追加しようとしましたが、役に立ちませんでした。

編集

「レイジー」接続を削除し、コードを変更したところ、機能するようになりました...「レイジー」が機能しなかった理由についてはまだ興味があります。動作するコードは次のとおりです。

dbconn = txmongo.MongoConnectionPool('localhost', 27017, 4)

@deferred()
def test_mongo():
    @defer.inlineCallbacks
    def cb(conn):
        tdb = conn.test
        oid = yield tdb.test.save({"s":1, "b":2})
        assert oid
        log.error(str(oid))
        obj = yield tdb.test.find({"_id":oid})
        assert obj 
        log.error(str(obj))
    dbconn.addCallback(cb)
    return dbconn
4

1 に答える 1

1

MongoConnectionPoolはdeferredを返します。これは、接続が確立されたときに発生し、接続ハンドラーを引数としてコールバックに渡します。あなたがすべきconn = yield MongoConnectionPool()です。

lazyMongoConnectionPoolは、接続が確立されるのを待たずに、接続ハンドラーを直接返します。

Lazyは通常、サービスの開始時にすぐに接続する必要のないWebサーバーやその他のサービスで使用されます。そうしたい場合は、怠惰な方法を使用しないでください。

于 2010-11-05T04:28:40.990 に答える