2010-11-04 39 views
1

我想用鼻子来测试我正在使用twisted和txmongo编写的应用程序。我甚至无法简单的用例类似下面的工作: 从nose.twistedtools导入反应器,推迟,threaded_reactor 进口记录 从twisted.internet进口推迟 进口txmongo使用鼻子来测试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

MongoConnectionPool会返回一个延迟,建立连接时,通过连接处理程序作为参数传递给回调被解雇。您应该conn = yield MongoConnectionPool()

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

懒惰通常由Web服务器和其他服务在服务启动时不需要立即连接的情况下使用。如果你想这样做,不要使用懒惰的方法。