]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.8] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18190)
authorMatthew Kokotovich <mkokotovich@gmail.com>
Sun, 26 Jan 2020 15:30:27 +0000 (09:30 -0600)
committerChris Withers <chris@withers.org>
Sun, 26 Jan 2020 15:30:27 +0000 (15:30 +0000)
(cherry picked from commit 62865f4532094017a9b780b704686ca9734bc329)

Co-authored-by: Matthew Kokotovich <mkokotovich@gmail.com>
Lib/unittest/mock.py
Lib/unittest/test/testmock/testasync.py
Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst [new file with mode: 0644]

index 34f2dd77ec6cd3493b55601d616904a60e922012..66ace80cb5f9c305ad19df2ad4f97c4646dcb32f 100644 (file)
@@ -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)
 
 
index 0bd7ae4929c3e79e94c85a07dd791e94b29e8e13..e68022afdcceaac4f7ed47763f5ca6be1c1051b3 100644 (file)
@@ -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 (file)
index 0000000..52c4ee1
--- /dev/null
@@ -0,0 +1 @@
+Allow AsyncMock to correctly patch static/class methods