TearDown 不要求使用 Tornado 进行单元测试

tearDown not called for unittesting with Tornado

我将 Rethinkdb 和 Tornado 与 rethinkdb.set_loop_type("tornado")

一起使用

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

这是我的单元测试基础 class:

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 会显示打印语句,但不会对数据库执行删除

使用 yield@gen.coroutine 使函数异步,这会更改其接口:调用者 必须 知道此更改。 unittest 框架对协程一无所知,因此 unittest 调用的方法都不可能是协程。

您可以使用 @tornado.testing.gen_test 而不是 @gen.coroutine,这样您就可以在测试中以及从 setUptearDown 调用的方法中使用 yield ,但不是 setUptearDown 本身(因为发电机无法在 super().setUp() 之前或 super().tearDown() 之后工作。使用 gen_test 的辅助方法并将其称为 没有 yield tearDown:

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()