使用Nose测试依赖txmongo的代码
我想用nose来测试我正在写的应用程序,这个应用是基于twisted和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
1 个回答
1
MongoConnectionPool 会返回一个延迟对象,这个对象会在连接建立后被触发,并把连接处理器作为参数传给回调函数。你应该使用 conn = yield MongoConnectionPool()
这样的代码。
而 lazyMongoConnectionPool 则会直接返回连接处理器,不用等到连接建立。
通常,懒加载(Lazy)是被用在一些网页服务器和其他不需要在服务启动时立即连接的服务上。如果你想要立即连接,就不要使用懒加载的方法。