diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2023-01-04 23:11:46 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-04 23:11:46 (GMT) |
commit | f49cc3c805dbc1bc54edeba3c248b875b3e6f3d3 (patch) | |
tree | 2dc4481958796cb4873b7e1b4b6f37d29f37fca1 | |
parent | fee4059d213401011457531933e64790b181f33c (diff) | |
download | cpython-f49cc3c805dbc1bc54edeba3c248b875b3e6f3d3.zip cpython-f49cc3c805dbc1bc54edeba3c248b875b3e6f3d3.tar.gz cpython-f49cc3c805dbc1bc54edeba3c248b875b3e6f3d3.tar.bz2 |
gh-100739: Respect mock spec when checking for unsafe prefixes (GH-100740)
(cherry picked from commit 7f1eefc6f4843f0fca60308f557a71af11d18a53)
Co-authored-by: Christian Klein <167265+cklein@users.noreply.github.com>
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
-rw-r--r-- | Lib/unittest/mock.py | 2 | ||||
-rw-r--r-- | Lib/unittest/test/testmock/testmock.py | 16 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-01-04-09-53-38.gh-issue-100740.-j5UjI.rst | 1 |
3 files changed, 18 insertions, 1 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 7832092..7453dfa 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -643,7 +643,7 @@ class NonCallableMock(Base): raise AttributeError("Mock object has no attribute %r" % name) elif _is_magic(name): raise AttributeError(name) - if not self._mock_unsafe: + if not self._mock_unsafe and (not self._mock_methods or name not in self._mock_methods): if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')): raise AttributeError( f"{name!r} is not a valid assertion. Use a spec " diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index fdba543..535f908 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1644,6 +1644,22 @@ class MockTest(unittest.TestCase): m.aseert_foo_call() m.assrt_foo_call() + # gh-100739 + def test_mock_safe_with_spec(self): + class Foo(object): + def assert_bar(self): + pass + + def assertSome(self): + pass + + m = Mock(spec=Foo) + m.assert_bar() + m.assertSome() + + m.assert_bar.assert_called_once() + m.assertSome.assert_called_once() + #Issue21262 def test_assert_not_called(self): m = Mock() diff --git a/Misc/NEWS.d/next/Library/2023-01-04-09-53-38.gh-issue-100740.-j5UjI.rst b/Misc/NEWS.d/next/Library/2023-01-04-09-53-38.gh-issue-100740.-j5UjI.rst new file mode 100644 index 0000000..4753e7b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-01-04-09-53-38.gh-issue-100740.-j5UjI.rst @@ -0,0 +1 @@ +Fix ``unittest.mock.Mock`` not respecting the spec for attribute names prefixed with ``assert``. |