环境:Python 3,龙卷风4.4。无法使用正常的单元测试,因为方法是异步的。 ttp://www.tornadoweb.org/en/stable/testing.html解释了如何对异步代码进行单元测试。但这只适用于龙卷风协同程序。我想测试的类是使用异步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)
但是我的方法声明如下:
类连接: 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中的一个错误。解决方法:
all = MyTestCase2
main()
答案 0 :(得分:3)
您可以在“await”表达式中使用它来等待“fetch”完成,而不是使用self.wait / self.stop回调:
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”(字符串)进行比较。