Модульное тестирование асинхронных методов tornado_json
Я пытаюсь настроить модульный тест для веб-приложения tornado_json. Я пытаюсь проверить почтовый обработчик, но мне не удается fetch
кажется, что метод возвращает объект _asyncio.Future, который, кажется, никогда не завершается / не имеет набора результатов. Я попытался опубликовать сводку кода, в данный момент я просто возвращаю элемент ['test']. Я посмотрел на https://github.com/tornadoweb/tornado/issues/1154, а также на документацию по торнадо. Похоже, мне нужно self.stop или self.wait(), чтобы завершить задачу, но я не знаю, как заставить это работать, или это решение. Любая помощь будет принята с благодарностью.
@schema.validate(
input_schema={
"type": "object",
"properties": {
"path": {"type": "string"}
},
"required": ["path"]
},
output_schema={
"type": "array",
"items": {
"properties": {"type": "string"}
}
}
)
@coroutine
def post(self):
attributes = dict(self.body)
path = attributes["path"]
response = ["test"]
return response
@gen_test
def test_POST_method(self):
body = json.dumps({'path': 'bin'})
self.http_client.fetch(self.get_url('/api/listmyfiles'),
method="POST",
body=body
)
response = self.wait()
print(response.result()))
Я получаю ошибку:asyncio.base_futures.InvalidStateError: Result is not set.
1 ответ
AsyncHTTPTestCase
имеет несколько различных режимов работы, которые нельзя смешивать.
@gen_test
: Используется сawait self.http_client.fetch(self.get_url(...))
:@gen_test async def test_post_method(self): response = await self.http_client.fetch(self.get_url(...))
self.stop
/self.wait
старый интерфейс, который в основном (но не полностью) устарел.AsyncHTTPClient
не будет (легко) совместим с этим интерфейсом в Tornado 6.0, поэтому я не буду показывать пример здесь.self.fetch
это сокращенный метод, который объединяет вызовыhttp_client.fetch
а такжеself.get_url
и используетstop
/wait
под одеялом (поэтому он не совместим с@gen_test
):def test_post_method(self): response = self.fetch('/api/listmyfiles')
Если единственная асинхронная вещь, которую вы делаете, это выборки HTTP, вы можете использовать self.fetch
, Если вам нужно сделать что-то еще асинхронное, используйте gen_test
и избегайте методов stop/wait/self.fetch.