Python 使用Nose测试txmongo相关代码

Python 使用Nose测试txmongo相关代码,python,twisted,nose,Python,Twisted,Nose,我想使用nose来测试我正在使用twisted和txmongo编写的应用程序。我甚至无法获得像以下这样的简单用例: 从nose.twistedtools导入反应器、延迟、线程化反应器 导入日志记录 从twisted.internet导入延迟 进口txmongo log = logging.getLogger("common.test.test_db") conn = txmongo.lazyMongoConnectionPool('localhost', 27017, 4) @deferre

我想使用nose来测试我正在使用twisted和txmongo编写的应用程序。我甚至无法获得像以下这样的简单用例: 从nose.twistedtools导入反应器、延迟、线程化反应器 导入日志记录 从twisted.internet导入延迟 进口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)
我尝试手动添加一个线程化的_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

MongoConnectionPool将返回一个deferred,当连接建立并将连接处理程序作为参数传递给回调时,将触发该延迟。您应该
conn=yield MongoConnectionPool()

lazyMongoConnectionPool将直接返回连接处理程序,而无需等待连接建立


Lazy通常由web服务器和其他服务使用,这些服务在服务启动时不需要立即连接。如果要执行此操作,请不要使用lazy方法。

MongoConnectionPool将返回一个deferred,当连接建立时,将连接处理程序作为参数传递给回调函数,该函数将被激发。您应该
conn=yield MongoConnectionPool()

lazyMongoConnectionPool将直接返回连接处理程序,而无需等待连接建立

Lazy通常由web服务器和其他服务使用,这些服务在服务启动时不需要立即连接。如果您想这样做,不要使用lazy方法