summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-01-04 23:11:46 (GMT)
committerGitHub <noreply@github.com>2023-01-04 23:11:46 (GMT)
commitf49cc3c805dbc1bc54edeba3c248b875b3e6f3d3 (patch)
tree2dc4481958796cb4873b7e1b4b6f37d29f37fca1
parentfee4059d213401011457531933e64790b181f33c (diff)
downloadcpython-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.py2
-rw-r--r--Lib/unittest/test/testmock/testmock.py16
-rw-r--r--Misc/NEWS.d/next/Library/2023-01-04-09-53-38.gh-issue-100740.-j5UjI.rst1
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``.