diff options
author | blhsing <github@ydooby.com> | 2019-09-11 14:28:06 (GMT) |
---|---|---|
committer | Michael Foord <voidspace@users.noreply.github.com> | 2019-09-11 14:28:06 (GMT) |
commit | 72c359912d36705a94fca8b63d80451905a14ae4 (patch) | |
tree | 9bc21f98a2253115e39e1e776ab1f0f4c2902526 /Lib | |
parent | 1abf54336fd2cb545c453d22dd5501392b3350b2 (diff) | |
download | cpython-72c359912d36705a94fca8b63d80451905a14ae4.zip cpython-72c359912d36705a94fca8b63d80451905a14ae4.tar.gz cpython-72c359912d36705a94fca8b63d80451905a14ae4.tar.bz2 |
bpo-37972: unittest.mock._Call now passes on __getitem__ to the __getattr__ chaining so that call() can be subscriptable (GH-15565)
* bpo-37972: unittest.mock._Call now passes on __getitem__ to the __getattr__ chaining so that call() can be subscriptable
* 📜🤖 Added by blurb_it.
* Update 2019-08-28-21-40-12.bpo-37972.kP-n4L.rst
added name of the contributor
* bpo-37972: made all dunder methods chainable for _Call
* bpo-37972: delegate only attributes of tuple instead to __getattr__
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/unittest/mock.py | 6 | ||||
-rw-r--r-- | Lib/unittest/test/testmock/testhelpers.py | 20 |
2 files changed, 26 insertions, 0 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 50e4959..a98decc 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2462,6 +2462,12 @@ class _Call(tuple): return _Call(name=name, parent=self, from_kall=False) + def __getattribute__(self, attr): + if attr in tuple.__dict__: + raise AttributeError + return tuple.__getattribute__(self, attr) + + def count(self, /, *args, **kwargs): return self.__getattr__('count')(*args, **kwargs) diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index 301bca4..f3c7acb 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -334,6 +334,26 @@ class CallTest(unittest.TestCase): self.assertEqual(_Call((('bar', 'barz'),),)[0], '') self.assertEqual(_Call((('bar', 'barz'), {'hello': 'world'}),)[0], '') + def test_dunder_call(self): + m = MagicMock() + m().foo()['bar']() + self.assertEqual( + m.mock_calls, + [call(), call().foo(), call().foo().__getitem__('bar'), call().foo().__getitem__()()] + ) + m = MagicMock() + m().foo()['bar'] = 1 + self.assertEqual( + m.mock_calls, + [call(), call().foo(), call().foo().__setitem__('bar', 1)] + ) + m = MagicMock() + iter(m().foo()) + self.assertEqual( + m.mock_calls, + [call(), call().foo(), call().foo().__iter__()] + ) + class SpecSignatureTest(unittest.TestCase): |