diff options
author | Shantanu <12621235+hauntsaninja@users.noreply.github.com> | 2022-12-24 20:39:27 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-24 20:39:27 (GMT) |
commit | 9975d4e7bac052c320880e026f757cddaa91b4bf (patch) | |
tree | 23ab1fb87e575d8f5eff6a0b65846fbe86055384 | |
parent | ad8d2ef54ffde39c6d59c4fc6c0e9b8c529b306d (diff) | |
download | cpython-9975d4e7bac052c320880e026f757cddaa91b4bf.zip cpython-9975d4e7bac052c320880e026f757cddaa91b4bf.tar.gz cpython-9975d4e7bac052c320880e026f757cddaa91b4bf.tar.bz2 |
[3.10] gh-100287: Fix unittest.mock.seal with AsyncMock (GH-100496) (#100508)
(cherry picked from commit e4b43ebb3afbd231a4e5630e7e358aa3093f8677)
Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
-rw-r--r-- | Lib/unittest/mock.py | 8 | ||||
-rw-r--r-- | Lib/unittest/test/testmock/testasync.py | 14 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-12-24-08-42-05.gh-issue-100287.n0oEuG.rst | 1 |
3 files changed, 18 insertions, 5 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a647e5d..7832092 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1010,15 +1010,15 @@ class NonCallableMock(Base): For non-callable mocks the callable variant will be used (rather than any custom subclass).""" - _new_name = kw.get("_new_name") - if _new_name in self.__dict__['_spec_asyncs']: - return AsyncMock(**kw) - if self._mock_sealed: attribute = f".{kw['name']}" if "name" in kw else "()" mock_name = self._extract_mock_name() + attribute raise AttributeError(mock_name) + _new_name = kw.get("_new_name") + if _new_name in self.__dict__['_spec_asyncs']: + return AsyncMock(**kw) + _type = type(self) if issubclass(_type, MagicMock) and _new_name in _async_method_magics: # Any asynchronous magic becomes an AsyncMock diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 22228b4..61269d6 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -8,7 +8,7 @@ from contextlib import contextmanager from asyncio import run, iscoroutinefunction from unittest import IsolatedAsyncioTestCase from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock, - create_autospec, sentinel, _CallList) + create_autospec, sentinel, _CallList, seal) def tearDownModule(): @@ -298,6 +298,14 @@ class AsyncSpecTest(unittest.TestCase): self.assertIsInstance(mock.async_method, AsyncMock) self.assertIsInstance(mock.normal_method, Mock) + def test_spec_normal_methods_on_class_with_mock_seal(self): + mock = Mock(AsyncClass) + seal(mock) + with self.assertRaises(AttributeError): + mock.normal_method + with self.assertRaises(AttributeError): + mock.async_method + def test_spec_mock_type_kw(self): def inner_test(mock_type): async_mock = mock_type(spec=async_func) @@ -1074,3 +1082,7 @@ class AsyncMockAssert(unittest.TestCase): 'Actual: [call(1)]'))) as cm: self.mock.assert_has_awaits([call(), call(1, 2)]) self.assertIsInstance(cm.exception.__cause__, TypeError) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2022-12-24-08-42-05.gh-issue-100287.n0oEuG.rst b/Misc/NEWS.d/next/Library/2022-12-24-08-42-05.gh-issue-100287.n0oEuG.rst new file mode 100644 index 0000000..b353f08 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-12-24-08-42-05.gh-issue-100287.n0oEuG.rst @@ -0,0 +1 @@ +Fix the interaction of :func:`unittest.mock.seal` with :class:`unittest.mock.AsyncMock`. |