модульное тестирование асинхронных методов tornado_json - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь настроить модульный тест для веб-приложения 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):<br> 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 Ответ

0 голосов
/ 14 ноября 2018

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.

...