Модульное тестирование асинхронных методов 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 имеет несколько различных режимов работы, которые нельзя смешивать.

  1. @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(...))
    
  2. self.stop/self.wait старый интерфейс, который в основном (но не полностью) устарел. AsyncHTTPClient не будет (легко) совместим с этим интерфейсом в Tornado 6.0, поэтому я не буду показывать пример здесь.

  3. 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.

Другие вопросы по тегам