summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvabr-g <vabr@google.com>2020-11-05 17:04:38 (GMT)
committerGitHub <noreply@github.com>2020-11-05 17:04:38 (GMT)
commit4662fa9bfe4a849fe87bfb321d8ef0956c89a772 (patch)
tree82067c4fbc0e0d76413b2fc8de1f73c777c82efa
parent133aa2d5816b69d8ee755e1a9d2d1977b9205736 (diff)
downloadcpython-4662fa9bfe4a849fe87bfb321d8ef0956c89a772.zip
cpython-4662fa9bfe4a849fe87bfb321d8ef0956c89a772.tar.gz
cpython-4662fa9bfe4a849fe87bfb321d8ef0956c89a772.tar.bz2
bpo-41877 Check for asert, aseert, assrt in mocks (GH-23165)
Currently, a Mock object which is not unsafe will raise an AttributeError if an attribute with the prefix assert or assret is accessed on it. This protects against misspellings of real assert method calls, which lead to tests passing silently even if the tested code does not satisfy the intended assertion. Recently a check was done in a large code base (Google) and three more frequent ways of misspelling assert were found causing harm: asert, aseert, assrt. These are now added to the existing check.
-rw-r--r--Lib/unittest/mock.py4
-rw-r--r--Lib/unittest/test/testmock/testmock.py11
-rw-r--r--Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst2
3 files changed, 14 insertions, 3 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index b495a5f..f5f502f 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -631,9 +631,9 @@ class NonCallableMock(Base):
elif _is_magic(name):
raise AttributeError(name)
if not self._mock_unsafe:
- if name.startswith(('assert', 'assret')):
+ if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')):
raise AttributeError("Attributes cannot start with 'assert' "
- "or 'assret'")
+ "or its misspellings")
result = self._mock_children.get(name)
if result is _deleted:
diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py
index ce674e7..194ce3f 100644
--- a/Lib/unittest/test/testmock/testmock.py
+++ b/Lib/unittest/test/testmock/testmock.py
@@ -1598,14 +1598,23 @@ class MockTest(unittest.TestCase):
#Issue21238
def test_mock_unsafe(self):
m = Mock()
- msg = "Attributes cannot start with 'assert' or 'assret'"
+ msg = "Attributes cannot start with 'assert' or its misspellings"
with self.assertRaisesRegex(AttributeError, msg):
m.assert_foo_call()
with self.assertRaisesRegex(AttributeError, msg):
m.assret_foo_call()
+ with self.assertRaisesRegex(AttributeError, msg):
+ m.asert_foo_call()
+ with self.assertRaisesRegex(AttributeError, msg):
+ m.aseert_foo_call()
+ with self.assertRaisesRegex(AttributeError, msg):
+ m.assrt_foo_call()
m = Mock(unsafe=True)
m.assert_foo_call()
m.assret_foo_call()
+ m.asert_foo_call()
+ m.aseert_foo_call()
+ m.assrt_foo_call()
#Issue21262
def test_assert_not_called(self):
diff --git a/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst b/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst
new file mode 100644
index 0000000..6f6fccb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-11-05-16-00-03.bpo-41877.FHbngM.rst
@@ -0,0 +1,2 @@
+Mock objects which are not unsafe will now raise an AttributeError if an attribute with the prefix asert, aseert,
+or assrt is accessed, in addition to this already happening for the prefixes assert or assret. \ No newline at end of file