This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author xtreak
Recipients asvetlov, xtreak
Date 2019-05-22.18:53:39
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1558551219.71.0.654055269398.issue37015@roundup.psfhosted.org>
In-reply-to
Content
patching _accept_connection2 attribute on loop object seems to return an AsyncMock.

➜  cpython git:(master) ✗ cat ../backups/bpo37015.py
import asyncio
from unittest.mock import patch
with patch.object(asyncio.get_event_loop(), '_accept_connection2') as f:
    print(f)
    f()
➜  cpython git:(master) ✗ ./python.exe ../backups/bpo37015.py
<AsyncMock name='_accept_connection2' id='4361411632'>
../backups/bpo37015.py:5: RuntimeWarning: coroutine 'AsyncMockMixin._mock_call' was never awaited
  f()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback


Relevant test

    def test_accept_connection_multiple(self):
        sock = mock.Mock()
        sock.accept.return_value = (mock.Mock(), mock.Mock())
        backlog = 1
        # Mock the coroutine generation for a connection to prevent
        # warnings related to un-awaited coroutines.
        mock_obj = mock.patch.object
        with mock_obj(self.loop, '_accept_connection2') as accept2_mock:
            print(f"{accept2_mock=}")
            accept2_mock.return_value = None
            with mock_obj(self.loop, 'create_task') as task_mock:
                task_mock.return_value = None
                self.loop._accept_connection(
                    mock.Mock(), sock, backlog=backlog)
        self.assertEqual(sock.accept.call_count, backlog)

When I specify new value which defaults to DEFAULT as Mock() then there is no AsyncMock. Same can be done in test and the warnings go away. My suspicion is that if there is a loop object with _accept_connection2 earlier in Python 3.7 <MagicMock name='_accept_connection2'> is returned by patch.object but now it returns an <AsyncMock name='_accept_connection2'> instead

# use explicit mock

import asyncio
from unittest.mock import patch, Mock

with patch.object(asyncio.get_event_loop(), '_accept_connection2', Mock()) as f:
    print(f)
    f()

➜  cpython git:(master) ✗ ./python.exe ../backups/bpo37015.py
<Mock id='4342533248'>
History
Date User Action Args
2019-05-22 18:53:39xtreaksetrecipients: + xtreak, asvetlov
2019-05-22 18:53:39xtreaksetmessageid: <1558551219.71.0.654055269398.issue37015@roundup.psfhosted.org>
2019-05-22 18:53:39xtreaklinkissue37015 messages
2019-05-22 18:53:39xtreakcreate