From: Matthew Kokotovich Date: Sat, 25 Jan 2020 10:17:47 +0000 (-0600) Subject: bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18116) X-Git-Tag: v3.9.0a4~224 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=62865f4532094017a9b780b704686ca9734bc329;p=thirdparty%2FPython%2Fcpython.git bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18116) --- diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 92b596f672c2..047ae7c25599 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -46,6 +46,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 73d31a296688..43b87498ef37 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 000000000000..52c4ee1b33bd --- /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