bpo-37251: Removes __code__ check from _is_async_obj. (GH-15830)
This commit is contained in:
parent
5a7d2e11aa
commit
f1a297acb6
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue