Hi, we ran into this AssertionError bug in one of our services which prompted me to work through upgrading our version of aiohttp to the latest 3.8.1. This aiohttp update though makes a change to how unittests are handled. Our existing unit tests are now failing with
TypeError: An asyncio.Future, a coroutine or an awaitable is required. We are using Python 3.6 which appears to have an extra dependency with
asynctest although we already have that installed and are using it (do I need to explicitly inject this dependency anywhere? The PR doesn’t seem to have an example < 3.7 in it). I have also removed the
@unittest_run_loop decorator since this appears to have been deprecated.
Our test case class inherits from
AioHTTPTestCase, and the call that throws the error is (with real values in the
async with self.client.post(...) as response:
The full error I’m seeing is:
/root/.pex/installed_wheels/e0e4d2b660dcc3b4f29b471afc56d17654b5049f/aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl/aiohttp/test_utils.py:324: in _request resp = await self._session.request(method, self.make_url(path), **kwargs) /root/.pex/installed_wheels/e0e4d2b660dcc3b4f29b471afc56d17654b5049f/aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl/aiohttp/client.py:536: in _request req, traces=traces, timeout=real_timeout /root/.pex/installed_wheels/e0e4d2b660dcc3b4f29b471afc56d17654b5049f/aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl/aiohttp/connector.py:542: in connect proto = await self._create_connection(req, traces, timeout) /root/.pex/installed_wheels/e0e4d2b660dcc3b4f29b471afc56d17654b5049f/aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl/aiohttp/connector.py:907: in _create_connection _, proto = await self._create_direct_connection(req, traces, timeout) /root/.pex/installed_wheels/e0e4d2b660dcc3b4f29b471afc56d17654b5049f/aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl/aiohttp/connector.py:1154: in _create_direct_connection hosts = await asyncio.shield(host_resolved) /usr/local/lib/python3.6/asyncio/tasks.py:681: in shield inner = ensure_future(arg, loop=loop) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ coro_or_future = <MagicMock name='mock()' id='140440515487616'> def ensure_future(coro_or_future, *, loop=None): """Wrap a coroutine or an awaitable in a future. If the argument is a Future, it is returned directly. """ if futures.isfuture(coro_or_future): if loop is not None and loop is not coro_or_future._loop: raise ValueError('loop argument must agree with Future') return coro_or_future elif coroutines.iscoroutine(coro_or_future): if loop is None: loop = events.get_event_loop() task = loop.create_task(coro_or_future) if task._source_traceback: del task._source_traceback[-1] return task elif compat.PY35 and inspect.isawaitable(coro_or_future): return ensure_future(_wrap_awaitable(coro_or_future), loop=loop) else: > raise TypeError('An asyncio.Future, a coroutine or an awaitable is ' 'required') E TypeError: An asyncio.Future, a coroutine or an awaitable is required
I have not been able to find an example of AioHTTPTestCase with python < 3.7 so I was hoping just a simple example would be enough to get me in the right direction. Thank you!