使用Nose测试依赖txmongo的代码

1 投票
1 回答
555 浏览
提问于 2025-04-16 06:34

我想用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)是被用在一些网页服务器和其他不需要在服务启动时立即连接的服务上。如果你想要立即连接,就不要使用懒加载的方法。

撰写回答