2016-03-01 34 views
0

我试图在编写Tornado应用程序时遵循TDD练习。我有一个端点与get方法,从几个API获取数据,过滤器,结合它并发送响应。对于这个get处理程序,我创建了一个帮助程序,它负责异步数据提取。我想为它编写测试。如何编写Tornado的AsyncHTTPClient测试?

助手看起来是这样的:

class DummyHelper(object): 
    @gen.coroutine 
    def fetch(self, url): 
     http_client = AsyncHTTPClient() 
     response = yield http_client.fetch(url) 

     raise gen.Return(response.body) 

而且测试:

from tornado.testing import AsyncHTTPTestCase 
from tornado.web import HTTPError 
import app 
from lib.handlers.dummy import DummyHelper 
from tornado.testing import gen_test 

class TestDummyHandler(AsyncHTTPTestCase):  
    def get_app(self): 
     return app.get_app() 

    @gen_test 
    def test_200_fetch(self): 
     helper = DummyHelper() 
     response = yield helper.fetch("http://google.com/") 
     self.assertEqual(response.code, 200) 

    @gen_test 
    def test_404_fetch(self): 
     helper = DummyHelper() 
     with self.assertRaises(HTTPError): 
      yield helper.fetch("http://google.com/test") 

一切工作正常进行test_200_fetch。但它不适用于test_404_fetch。如何使它工作?我应该写这些测试吗?

回答

1

该测试是针对不同的例外。有两种HTTPError

您需要使用从HttpClient的一个提高。

提示

  1. ,如果你不是测试RequestHandler你可以用AsyncTestCase,它不需要get_app
  2. 如果你的测试依赖于外部资源(google..com),不能轻易孤立...这不是一个单元测试,更集成一个。这不是一件坏事,但值得注意。

from tornado import gen 
from tornado.httpclient import AsyncHTTPClient 


class DummyHelper(object): 
    @gen.coroutine 
    def fetch(self, url): 
     http_client = AsyncHTTPClient() 
     response = yield http_client.fetch(url) 
     raise gen.Return(response) 


import unittest 
from tornado.testing import AsyncTestCase 
from tornado.httpclient import HTTPError 
from tornado.testing import gen_test 

class TestDummyHandler(AsyncTestCase): 

    @gen_test 
    def test_200_fetch(self): 
     helper = DummyHelper() 
     response = yield helper.fetch("http://google.com/") 
     self.assertEqual(response.code, 200) 

    @gen_test 
    def test_404_fetch(self): 
     helper = DummyHelper() 
     with self.assertRaises(HTTPError): 
      yield helper.fetch("http://google.com/test") 

if __name__ == '__main__': 
    unittest.main() 
+0

可以写一段代码如何处理404'DummyHelper.fetch'。我试图执行你提到的内容,但仍然失败。 –

+0

我已经添加了一些示例 – kwarunek