2010-11-04 38 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服務器和其他服務在服務啓動時不需要立即連接的情況下使用。如果你想這樣做,不要使用懶惰的方法。