diff options
-rw-r--r-- | NEWS.d/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst | 2 | ||||
-rw-r--r-- | mock/mock.py | 2 | ||||
-rw-r--r-- | mock/tests/testmock.py | 10 |
3 files changed, 13 insertions, 1 deletions
diff --git a/NEWS.d/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst b/NEWS.d/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst new file mode 100644 index 0000000..f385571 --- /dev/null +++ b/NEWS.d/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst @@ -0,0 +1,2 @@ +Fix bug that prevented using :meth:`reset_mock <unittest.mock.Mock.reset_mock>` +on mock instances with deleted attributes diff --git a/mock/mock.py b/mock/mock.py index cb0a577..a9b52ab 100644 --- a/mock/mock.py +++ b/mock/mock.py @@ -673,7 +673,7 @@ class NonCallableMock(Base): self._mock_side_effect = None for child in self._mock_children.values(): - if isinstance(child, _SpecState): + if isinstance(child, _SpecState) or child is _deleted: continue child.reset_mock(visited) diff --git a/mock/tests/testmock.py b/mock/tests/testmock.py index a61dff1..cda4124 100644 --- a/mock/tests/testmock.py +++ b/mock/tests/testmock.py @@ -1662,6 +1662,16 @@ class MockTest(unittest.TestCase): self.assertRaises(AttributeError, getattr, mock, 'f') + def test_reset_mock_does_not_raise_on_attr_deletion(self): + # bpo-31177: reset_mock should not raise AttributeError when attributes + # were deleted in a mock instance + mock = Mock() + mock.child = True + del mock.child + mock.reset_mock() + self.assertFalse(hasattr(mock, 'child')) + + def test_class_assignable(self): for mock in Mock(), MagicMock(): self.assertNotIsInstance(mock, int) |