summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2015-04-14 06:12:42 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2015-04-14 06:12:42 (GMT)
commita468db9b0bd8d17575923b91db5fbc4a222d4252 (patch)
treece2ee26a354e880ce35c3eabf7c25601823e6080
parentcd1aa9158ec89d541ed6309f1766e188778a1499 (diff)
downloadcpython-a468db9b0bd8d17575923b91db5fbc4a222d4252.zip
cpython-a468db9b0bd8d17575923b91db5fbc4a222d4252.tar.gz
cpython-a468db9b0bd8d17575923b91db5fbc4a222d4252.tar.bz2
Issue #23310: Fix MagicMock's initializer to work with __methods__.
Behavior equivalent to m.configure_mock(). Patch by Kasia Jachim.
-rw-r--r--Lib/unittest/mock.py5
-rw-r--r--Lib/unittest/test/testmock/testmagicmethods.py15
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
4 files changed, 22 insertions, 2 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 6a0fd50..c3ab4e8 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -1789,14 +1789,15 @@ def _set_return_value(mock, method, name):
class MagicMixin(object):
def __init__(self, *args, **kw):
+ self._mock_set_magics() # make magic work for kwargs in init
_safe_super(MagicMixin, self).__init__(*args, **kw)
- self._mock_set_magics()
+ self._mock_set_magics() # fix magic broken by upper level init
def _mock_set_magics(self):
these_magics = _magics
- if self._mock_methods is not None:
+ if getattr(self, "_mock_methods", None) is not None:
these_magics = _magics.intersection(self._mock_methods)
remove_magics = set()
diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py
index 3c53ec4..bb9b956 100644
--- a/Lib/unittest/test/testmock/testmagicmethods.py
+++ b/Lib/unittest/test/testmock/testmagicmethods.py
@@ -450,5 +450,20 @@ class TestMockingMagicMethods(unittest.TestCase):
bar_direct = m.__rdivmod__(2)
self.assertIsInstance(bar_direct, MagicMock)
+ # http://bugs.python.org/issue23310
+ # Check if you can change behaviour of magic methds in MagicMock init
+ def test_magic_in_initialization(self):
+ m = MagicMock(**{'__str__.return_value': "12"})
+ self.assertEqual(str(m), "12")
+
+ def test_changing_magic_set_in_initialization(self):
+ m = MagicMock(**{'__str__.return_value': "12"})
+ m.__str__.return_value = "13"
+ self.assertEqual(str(m), "13")
+ m = MagicMock(**{'__str__.return_value': "12"})
+ m.configure_mock(**{'__str__.return_value': "14"})
+ self.assertEqual(str(m), "14")
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/Misc/ACKS b/Misc/ACKS
index 48d20ef..2a5236e 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -849,6 +849,7 @@ Hugo Lopes Tavares
Anne Lord
Tom Loredo
Justin Love
+Kasia Jachim
Ned Jackson Lovely
Chalmer Lowe
Jason Lowe
diff --git a/Misc/NEWS b/Misc/NEWS
index 969da2c..4a9dad8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -136,6 +136,9 @@ Library
- Issue #22117: Fix os.utime(), it now rounds the timestamp towards minus
infinity (-inf) instead of rounding towards zero.
+- Issue #23310: Fix MagicMock's initializer to work with __methods__, just
+ like configure_mock(). Patch by Kasia Jachim.
+
Build
-----