diff options
author | Matthew Kokotovich <mkokotovich@gmail.com> | 2020-01-26 15:30:27 (GMT) |
---|---|---|
committer | Chris Withers <chris@withers.org> | 2020-01-26 15:30:27 (GMT) |
commit | 19be85c76503535c101b38194d282187de0ff631 (patch) | |
tree | e305fbe463f2f7da5cd62b25b92b2efcd94196e9 | |
parent | eebcff8c071b38b53bd429892524ba8518cbeb98 (diff) | |
download | cpython-19be85c76503535c101b38194d282187de0ff631.zip cpython-19be85c76503535c101b38194d282187de0ff631.tar.gz cpython-19be85c76503535c101b38194d282187de0ff631.tar.bz2 |
[3.8] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18190)
(cherry picked from commit 62865f4532094017a9b780b704686ca9734bc329)
Co-authored-by: Matthew Kokotovich <mkokotovich@gmail.com>
-rw-r--r-- | Lib/unittest/mock.py | 2 | ||||
-rw-r--r-- | Lib/unittest/test/testmock/testasync.py | 23 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst | 1 |
3 files changed, 26 insertions, 0 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 34f2dd7..66ace80 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -48,6 +48,8 @@ _safe_super = super def _is_async_obj(obj): if _is_instance_mock(obj) and not isinstance(obj, AsyncMock): return False + if hasattr(obj, '__func__'): + obj = getattr(obj, '__func__') return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 0bd7ae4..e68022a 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -19,6 +19,15 @@ class AsyncClass: def normal_method(self): pass + @classmethod + async def async_class_method(cls): + pass + + @staticmethod + async def async_static_method(): + pass + + class AwaitableClass: def __await__(self): yield @@ -71,6 +80,20 @@ class AsyncPatchDecoratorTest(unittest.TestCase): test_async() + def test_is_AsyncMock_patch_staticmethod(self): + @patch.object(AsyncClass, 'async_static_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + def test_is_AsyncMock_patch_classmethod(self): + @patch.object(AsyncClass, 'async_class_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + def test_async_def_patch(self): @patch(f"{__name__}.async_func", return_value=1) @patch(f"{__name__}.async_func_args", return_value=2) diff --git a/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst new file mode 100644 index 0000000..52c4ee1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst @@ -0,0 +1 @@ +Allow AsyncMock to correctly patch static/class methods |