Skip to content

Commit e63e617

Browse files
and3rsoncjw296
authored andcommitted
bpo-35357: Add _mock_ prefix to name/parent/from_kall attributes of _Call/_MagicProxy. (#10873)
Fix minor typo in test function name.
1 parent eeb719e commit e63e617

File tree

4 files changed

+34
-16
lines changed

4 files changed

+34
-16
lines changed

Lib/unittest/mock.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2040,9 +2040,9 @@ def __new__(cls, value=(), name='', parent=None, two=False,
20402040

20412041
def __init__(self, value=(), name=None, parent=None, two=False,
20422042
from_kall=True):
2043-
self.name = name
2044-
self.parent = parent
2045-
self.from_kall = from_kall
2043+
self._mock_name = name
2044+
self._mock_parent = parent
2045+
self._mock_from_kall = from_kall
20462046

20472047

20482048
def __eq__(self, other):
@@ -2059,8 +2059,8 @@ def __eq__(self, other):
20592059
else:
20602060
self_name, self_args, self_kwargs = self
20612061

2062-
if (getattr(self, 'parent', None) and getattr(other, 'parent', None)
2063-
and self.parent != other.parent):
2062+
if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
2063+
and self._mock_parent != other._mock_parent):
20642064
return False
20652065

20662066
other_name = ''
@@ -2104,17 +2104,17 @@ def __eq__(self, other):
21042104

21052105

21062106
def __call__(self, *args, **kwargs):
2107-
if self.name is None:
2107+
if self._mock_name is None:
21082108
return _Call(('', args, kwargs), name='()')
21092109

2110-
name = self.name + '()'
2111-
return _Call((self.name, args, kwargs), name=name, parent=self)
2110+
name = self._mock_name + '()'
2111+
return _Call((self._mock_name, args, kwargs), name=name, parent=self)
21122112

21132113

21142114
def __getattr__(self, attr):
2115-
if self.name is None:
2115+
if self._mock_name is None:
21162116
return _Call(name=attr, from_kall=False)
2117-
name = '%s.%s' % (self.name, attr)
2117+
name = '%s.%s' % (self._mock_name, attr)
21182118
return _Call(name=name, parent=self, from_kall=False)
21192119

21202120

@@ -2125,8 +2125,8 @@ def index(self, *args, **kwargs):
21252125
return self.__getattr__('index')(*args, **kwargs)
21262126

21272127
def __repr__(self):
2128-
if not self.from_kall:
2129-
name = self.name or 'call'
2128+
if not self._mock_from_kall:
2129+
name = self._mock_name or 'call'
21302130
if name.startswith('()'):
21312131
name = 'call%s' % name
21322132
return name
@@ -2152,9 +2152,9 @@ def call_list(self):
21522152
vals = []
21532153
thing = self
21542154
while thing is not None:
2155-
if thing.from_kall:
2155+
if thing._mock_from_kall:
21562156
vals.append(thing)
2157-
thing = thing.parent
2157+
thing = thing._mock_parent
21582158
return _CallList(reversed(vals))
21592159

21602160

Lib/unittest/test/testmock/testcallable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class Multi(SomeClass, Sub):
128128
result.foo.assert_called_once_with(3, 2, 1)
129129

130130

131-
def test_create_autopsec(self):
131+
def test_create_autospec(self):
132132
mock = create_autospec(X)
133133
instance = mock()
134134
self.assertRaises(TypeError, instance)

Lib/unittest/test/testmock/testmock.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from unittest.mock import (
1010
call, DEFAULT, patch, sentinel,
1111
MagicMock, Mock, NonCallableMock,
12-
NonCallableMagicMock, _CallList,
12+
NonCallableMagicMock, _Call, _CallList,
1313
create_autospec
1414
)
1515

@@ -1665,6 +1665,20 @@ def test_class_assignable(self):
16651665
self.assertIsInstance(mock, int)
16661666
mock.foo
16671667

1668+
def test_name_attribute_of_call(self):
1669+
# bpo-35357: _Call should not disclose any attributes whose names
1670+
# may clash with popular ones (such as ".name")
1671+
self.assertIsNotNone(call.name)
1672+
self.assertEqual(type(call.name), _Call)
1673+
self.assertEqual(type(call.name().name), _Call)
1674+
1675+
def test_parent_attribute_of_call(self):
1676+
# bpo-35357: _Call should not disclose any attributes whose names
1677+
# may clash with popular ones (such as ".parent")
1678+
self.assertIsNotNone(call.parent)
1679+
self.assertEqual(type(call.parent), _Call)
1680+
self.assertEqual(type(call.parent().parent), _Call)
1681+
16681682

16691683
if __name__ == '__main__':
16701684
unittest.main()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Internal attributes' names of unittest.mock._Call and
2+
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
3+
_mock_ in order to prevent clashes with widely used object attributes.
4+
Fixed minor typo in test function name.

0 commit comments

Comments
 (0)