У меня есть базовый обработчик, от которого наследуются другие классы.При тестировании с базовым 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()
длядобавить атрибуты в обработчик запроса, но кажется, что запрос завершается неудачно без этого.Это не помогает, если я инициализирую в базовом классе, я должен инициализировать в каждом обработчике для тестов, чтобы работать.Похоже, мертвый код, чтобы сделать это в каждом классе?