如何做单元测试龙卷风+异步def?

环境:Python 3,龙卷风4.4。 由于方法是异步的,因此不能使用正常的unittests。 有一个ttp://www.tornadoweb.org/en/stable/testing.html,它解释了如何对异步代码进行单元测试。 但是,这只适用于龙卷风协程。 我想测试的类是使用async def语句,并且不能以这种方式进行测试。 例如,下面是一个使用ASyncHTTPClient.fetch及其回调参数的测试用例:

class MyTestCase2(AsyncTestCase):
    def test_http_fetch(self):
        client = AsyncHTTPClient(self.io_loop)
        client.fetch("http://www.tornadoweb.org/", self.stop)
        response = self.wait()
        # Test contents of response
        self.assertIn("FriendFeed", response.body)

但我的方法是这样声明的:

class Connection:async def get_data(url,* args):#....

没有回调。 如何从测试用例中“等待”这种方法?

更新:基于Jessie的回答,我创建了这个MWE:

import unittest

from tornado.httpclient import AsyncHTTPClient
from tornado.testing import AsyncTestCase, gen_test, main


class MyTestCase2(AsyncTestCase):
    @gen_test
    async def test_01(self):
        await self.do_more()

    async def do_more(self):
        self.assertEqual(1+1, 2)

main()

结果是这样的:

>py -3 -m test.py
E
======================================================================
ERROR: all (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute 'all'

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
[E 170205 10:05:43 testing:731] FAIL

没有回溯。 但是,如果我用unittest.main()替换tornado.testing.main(),它会突然开始工作。

但为什么? 我猜想对于asnyc单元测试,我需要使用tornado.testing.main(http://www.tornadoweb.org/en/stable/testing.html#tornado.testing.main)

我很困惑。

更新2:这是tornado.testing中的一个bug。 解决方法:

all = MyTestCase2
main()

除了使用self.wait / self.stop回调之外,您还可以通过在“await”表达式中使用它来等待“fetch”完成:

import unittest

from tornado.httpclient import AsyncHTTPClient
from tornado.testing import AsyncTestCase, gen_test


class MyTestCase2(AsyncTestCase):
    @gen_test
    async def test_http_fetch(self):
        client = AsyncHTTPClient(self.io_loop)
        response = await client.fetch("http://www.tornadoweb.org/")
        # Test contents of response
        self.assertIn("FriendFeed", response.body.decode())

unittest.main()

我必须在代码中进行的其他更改是在主体上调用“decode”,以便将主体(字节)与字符串“FriendFeed”进行比较。

链接地址: http://www.djcxy.com/p/27857.html

上一篇: Howto do unittest for tornado + async def?

下一篇: Can not finish a RequestHandler in Tornado with self.finish()