bpo-37251: Removes __code__ check from _is_async_obj. (GH-15830)

This commit is contained in:
Lisa Roach 2019-09-10 12:18:40 +01:00 committed by GitHub
parent 5a7d2e11aa
commit f1a297acb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 3 deletions

View File

@ -46,10 +46,9 @@ FILTER_DIR = True
_safe_super = super _safe_super = super
def _is_async_obj(obj): def _is_async_obj(obj):
if getattr(obj, '__code__', None): if _is_instance_mock(obj) and not isinstance(obj, AsyncMock):
return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj)
else:
return False return False
return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj)
def _is_async_func(func): def _is_async_func(func):

View File

@ -18,6 +18,10 @@ class AsyncClass:
def normal_method(self): def normal_method(self):
pass pass
class AwaitableClass:
def __await__(self):
yield
async def async_func(): async def async_func():
pass pass
@ -160,6 +164,10 @@ class AsyncAutospecTest(unittest.TestCase):
with self.assertRaises(RuntimeError): with self.assertRaises(RuntimeError):
create_autospec(async_func, instance=True) create_autospec(async_func, instance=True)
def test_create_autospec_awaitable_class(self):
awaitable_mock = create_autospec(spec=AwaitableClass())
self.assertIsInstance(create_autospec(awaitable_mock), AsyncMock)
def test_create_autospec(self): def test_create_autospec(self):
spec = create_autospec(async_func_args) spec = create_autospec(async_func_args)
awaitable = spec(1, 2, c=3) awaitable = spec(1, 2, c=3)
@ -321,6 +329,13 @@ class AsyncSpecSetTest(unittest.TestCase):
self.assertIsInstance(mock.normal_method, MagicMock) self.assertIsInstance(mock.normal_method, MagicMock)
self.assertIsInstance(mock, MagicMock) self.assertIsInstance(mock, MagicMock)
def test_magicmock_lambda_spec(self):
mock_obj = MagicMock()
mock_obj.mock_func = MagicMock(spec=lambda x: x)
with patch.object(mock_obj, "mock_func") as cm:
self.assertIsInstance(cm, MagicMock)
class AsyncArguments(unittest.TestCase): class AsyncArguments(unittest.TestCase):
def test_add_return_value(self): def test_add_return_value(self):

View File

@ -0,0 +1,3 @@
Remove `__code__` check in AsyncMock that incorrectly
evaluated function specs as async objects but failed to evaluate classes
with `__await__` but no `__code__` attribute defined as async objects.