【问题标题】:Using Nose to test txmongo dependent code使用 Nose 测试 txmongo 依赖代码
【发布时间】:2010-11-04 19:26:12
【问题描述】:

我想使用nose 来测试我正在使用twisted 和txmongo 编写的应用程序。我什至无法获得像以下工作这样的简单用例: fromnose.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)

我尝试手动添加 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

【问题讨论】:

    标签: python twisted nose


    【解决方案1】:

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

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

    Lazy 通常用于 Web 服务器和其他在服务启动时不需要立即连接的服务。如果你想这样做,请不要使用惰性方法。

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2016-02-04
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多