Запускать фоновую асинхронную задачу в запросе без закрытия цикла событий в pytest-sanic - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу запустить 2 теста параллельно в pytest-sanic, однако, когда я пытаюсь это сделать, цикл обработки событий закрывается и выдает следующую ошибку.

RuntimeError('Event loop is closed')

Вот как выглядит упрощенная версия кода

import pytest
import json
from main import make_app

@pytest.yield_fixture
def app():
    app = make_app()
    yield app

@pytest.fixture
def test_cli(loop, app, test_client):

    return loop.run_until_complete(test_client(app))



async def test_upload_api(test_cli):
    data = {
    "urls" : "asd"
    }
    response = await test_cli.post('/v1/images/upload',data=json.dumps(data))

    assert response.status == 200

    response = await test_cli.get('/v1/images')

    assert response.status == 200

Как выполнить несколько запросов в одном тестовом примере и один раз с асинхронными операциями в фоновом режиме.

ОБНОВЛЕНИЕ: Я выполняю асинхронную задачу в вызове API, и когда я отключаю ее, я не получаю ошибку.Однако мне нужно протестировать API, пока он выполняет асинхронную задачу в фоновом режиме.

===================================================================================== 2 passed in 0.14 seconds =====================================================================================
exception calling callback for <Future at 0x7fa4cc971a90 state=finished returned list>
Traceback (most recent call last):
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 324, in _invoke_callbacks
    callback(self)
  File "/usr/lib/python3.6/asyncio/futures.py", line 419, in _call_set_state
    dest_loop.call_soon_threadsafe(_set_state, destination, source)
  File "/usr/lib/python3.6/asyncio/base_events.py", line 620, in call_soon_threadsafe
    self._check_closed()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 357, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Task was destroyed but it is pending!
task: <Task pending coro=<UrlCrawler.fetch_urls() running at /home/jibin/PycharmProjects/imgurupload/controllers/UrlCrawler.py:68> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fa4ccab81c8>()]>>
Exception ignored in: <coroutine object UrlCrawler.fetch_urls at 0x7fa4d03ff990>
Traceback (most recent call last):
  File 

"/home/jibin/PycharmProjects/imgurupload/controllers/UrlCrawler.py", line 71, in fetch_urls
    kwargs["finished"][id] = datetime.datetime.utcnow().isoformat()
  File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 828, in __aexit__
    await self.close()
  File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 779, in close
    self._connector.close()
  File "/usr/local/lib/python3.6/dist-packages/aiohttp/connector.py", line 657, in close
    ev.cancel()
  File "/usr/local/lib/python3.6/dist-packages/aiohttp/locks.py", line 38, in cancel
    waiter.cancel()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 574, in call_soon
    self._check_closed()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 357, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Task was destroyed but it is pending!
task: <Task pending coro=<TCPConnector._resolve_host() running at /usr/local/lib/python3.6/dist-packages/aiohttp/connector.py:730> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/lib/python3.6/asyncio/futures.py:408, <TaskWakeupMethWrapper object at 0x7fa4cc98e2b8>()]> cb=[shield.<locals>._done_callback() at /usr/lib/python3.6/asyncio/tasks.py:679]>
...