pytest-dev/pytest-mock

async_stub doesn't need to be awaited

AstraLuma opened this issue · 1 comments

(event_loop from pytest-asyncio)

async def test_demo(event_loop, mocker):
    callee = mocker.async_stub('callee')

    event_loop.call_soon_threadsafe(callee)  # Wrong!

    await asyncio.sleep(0)

    assert callee.called == 1

Expected behavior: callee.called should be zero

Actual behavior: callee.called is one, and a warning is produced:

tests/test_basics.py::test_demo
  /usr/lib64/python3.11/asyncio/events.py:80: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    self._context.run(self._callback, *self._args)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

I'm calling this behavior incorrect (or at least unhelpful) because if I were to use a real coroutine instead of async_stub(), the body never would have executed.

Hi @AstraLuma,

Can you please replace the mocker fixture to use unittest.mock instead? That is helpful to see if the problem lies with pytest-mock or with unittest.mock itself.

async def test_demo(event_loop):
    callee = unittest.mock.AsyncMock('callee')

    event_loop.call_soon_threadsafe(callee)  # Wrong!

    await asyncio.sleep(0)

    assert callee.called == 1