Issue 37047: Refactor AsyncMock setup logic in create_autospec (original) (raw)

import asyncio from unittest.mock import create_autospec

async def foo(): pass

spec = create_autospec(foo) awaitable = spec()

async def main(): await awaitable

asyncio.run(main())

Traceback (most recent call last): File "/tmp/spam.py", line 13, in asyncio.run(main()) File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/asyncio/runners.py", line 43, in run return loop.run_until_complete(main) File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/asyncio/base_events.py", line 614, in run_until_complete return future.result() File "/tmp/spam.py", line 11, in main await awaitable File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", line 2045, in _mock_call return await proxy() File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", line 2043, in proxy await self.awaited._notify() File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", line 596, in getattr raise AttributeError("Mock object has no attribute %r" % name) AttributeError: Mock object has no attribute 'awaited'

spec.assert_awaited_once_with(1) # Due to late binding assert_not_awaited is always called TypeError: assert_not_awaited() takes 1 positional argument but 2 were given

spec.assert_not_awaited() AssertionError: Expected mock to have been awaited once. Awaited 1 times.

I have a PR with the above changes that I will post shortly for review.

[0] https://github.com/python/cpython/blob/7114c6504a60365b8b0cd718da0ec8a737599fb9/Lib/unittest/mock.py#L2506 [1] https://github.com/python/cpython/blob/7114c6504a60365b8b0cd718da0ec8a737599fb9/Lib/unittest/mock.py#L2518 [2] https://github.com/python/cpython/blob/7114c6504a60365b8b0cd718da0ec8a737599fb9/Lib/unittest/mock.py#L2154 [3] https://docs.python.org/3.8/library/unittest.mock.html#mocking-magic-methods