2016-03-01 2 views
0

Я пытаюсь следовать практике TDD при написании приложения Tornado. У меня есть конечная точка с методом get, которые получают данные из нескольких API, фильтруют, объединяют и отправляют ответ. Для этого обработчика get я создал помощника, который отвечает за выборку асинхронных данных. И я хочу написать для этого тесты.Как написать тесты для AsyncHTTPClient Tornado?

Helper выглядит следующим образом:

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

Смежные вопросы