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!