1

我正在使用 Rethinkdb 和 Tornadorethinkdb.set_loop_type("tornado")

我正在使用 python unittests 来测试我的服务器路由。

这是我的单元测试基类:

class ServerTest(AsyncHTTPTestCase):
    def setUp(self):
        super(ServerTest, self).setUp()

    def get_app(self):
        return Application(self.routes, debug = False)

    def post(self, route, data):
        result = self.fetch("/%s" % route, method = "POST",
                                body = json.dumps(data)).body
        return json.loads(result)

    def tearDown(self):
        super(ServerTest, self).tearDown()
        conn = yield r.connect()
        yield r.db("test").table("test_table").delete().run(conn)
        conn.close()

我注意到它setUp运行正常,但tearDown不是。我所有的单元测试都正确通过,但不调用 tearDown 中的打印语句。

编辑:我已经把它缩小到我在tearDown中调用yield的事实。

编辑:将@gen.coroutine 添加到 tearDown 显示打印语句,但不对数据库执行删除

4

1 回答 1

4

使用yieldand@gen.coroutine使函数异步,这会改变它的接口:调用者必须意识到这种变化。框架对unittest协程一无所知,所以调用的任何方法unittest都不可能是协程。

代替@gen.coroutine,您可以使用@tornado.testing.gen_test,它允许您yield在测试中使用,以及在从setUpand调用的方法中使用tearDown,但不能在setUpandtearDown本身中使用(因为生成器机器无法在 之前super().setUp()或之后工作super().tearDown()。使用辅助方法并在没有in 的情况下gen_test调用它: yieldtearDown

def tearDown(self):
    self.tearDownHelper()
    super(ServerTest, self).tearDown()

@tornado.testing.gen_test
def tearDownHelper(self):
    conn = yield r.connect()
    yield r.db("test").table("test_table").delete().run(conn)
    conn.close()
于 2015-10-07T12:52:33.967 回答