Торнадо: правильный способ проверки родительских классов - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть базовый обработчик, от которого наследуются другие классы.При тестировании с базовым RequestHandler Все тестирование в порядке.Однако при обтекании BaseHandler я получаю tornado.simple_httpclient.HTTPStreamClosedError: Stream closed

Tornado 5.1.1

class BaseHandler(RequestHandler):
    def initialize(self):
        self.logger = self.application.logger
        self.redis = self.application.redis

    def data_received(self, chunk):
        pass

    def write_error(self, status_code, **kwargs):
        self.set_header('Content-Type', 'application/json')

        traceback_exception = (
            traceback
            .format_exception(*kwargs['exc_info'])
        )
        result = {
            'error': {
                'code': status_code,
                'message': self._reason,
                'traceback': traceback_exception,
            }
        }
        logger.error(result, request_body=self.request.arguments)
        self.finish(json.dumps(result))

    @property
    def input_cls(self):
        raise RuntimeError("input_cls must be implemented.")

    @property
    def output_cls(self):
        raise RuntimeError("output_cls must be set.")

    def on_finish(self):
        logger.info(tornado_log(self))
        super().on_finish()

простая обертка поверх этого, как показано ниже, выдаст ошибку.

class API(BaseHandler):
    route = r'/api'
    async def get(self):
        self.write('OK')

контрольный пример настроен так.ничего необычного в App(), только несколько лишних битов, которые не вызывают никаких проблем

class TestBaseHandler(AsyncHTTPTestCase):

    def get_app(self):
        return App()

    def test_BaseHandler(self):
        response = self.fetch('/api', raise_error=True)
        self.assertEqual(response.code, 200)

замена BaseHandler для торнадо RequestHandler вернет результат.При поиске ошибки говорится, что клиент закрыл соединение, а сервер выдает эту ошибку.Так что что-то должно быть не так с моей тестовой настройкой классов обработчика оболочки, но я не могу найти какие-либо ресурсы для решения этой проблемы

Редактировать: Не уверен почему, так как я использовал def initialise() длядобавить атрибуты в обработчик запроса, но кажется, что запрос завершается неудачно без этого.Это не помогает, если я инициализирую в базовом классе, я должен инициализировать в каждом обработчике для тестов, чтобы работать.Похоже, мертвый код, чтобы сделать это в каждом классе?

...