【问题标题】:tearDown not called for unittesting with TornadotearDown 不需要使用 Tornado 进行单元测试
【发布时间】:2015-10-07 04:02:38
【问题描述】:

我正在使用 Rethinkdb 和 Tornado 以及 rethinkdb.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 显示打印语句,但不对数据库执行删除

【问题讨论】:

    标签: python-2.7 tornado python-unittest rethinkdb-python


    【解决方案1】:

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

    除了@gen.coroutine,您可以使用@tornado.testing.gen_test,它允许您在测试中使用yield,在从setUptearDown调用的方法中,但不能使用setUptearDown本身(因为发电机机器在super().setUp() 之前或super().tearDown() 之后无法工作。使用带有gen_test 的辅助方法并在tearDown 中调用它没有 yield

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多