summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorMatthew Kokotovich <mkokotovich@gmail.com>2020-01-26 09:30:27 -0600
committerChris Withers <chris@withers.org>2020-01-26 15:30:27 +0000
commit19be85c76503535c101b38194d282187de0ff631 (patch)
treee305fbe463f2f7da5cd62b25b92b2efcd94196e9 /Lib
parenteebcff8c071b38b53bd429892524ba8518cbeb98 (diff)
downloadcpython-git-19be85c76503535c101b38194d282187de0ff631.tar.gz
[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>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/unittest/mock.py2
-rw-r--r--Lib/unittest/test/testmock/testasync.py23
2 files changed, 25 insertions, 0 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 34f2dd77ec..66ace80cb5 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 0bd7ae4929..e68022afdc 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)