]> granicus.if.org Git - python/commitdiff
Issue #23310: Fix MagicMock's initializer to work with __methods__.
authorŁukasz Langa <lukasz@langa.pl>
Tue, 14 Apr 2015 06:12:42 +0000 (23:12 -0700)
committerŁukasz Langa <lukasz@langa.pl>
Tue, 14 Apr 2015 06:12:42 +0000 (23:12 -0700)
Behavior equivalent to m.configure_mock().  Patch by Kasia Jachim.

Lib/unittest/mock.py
Lib/unittest/test/testmock/testmagicmethods.py
Misc/ACKS
Misc/NEWS

index 6a0fd50358835981f37f8c778b4a92d9cbb0defe..c3ab4e82e897c68a16af830107892e8c06f526a7 100644 (file)
@@ -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()
index 3c53ec4f0e12fdd4ee545c75afa07ab40d0c6469..bb9b956bb2e43e1ec815a7edd3b278e2137db2e5 100644 (file)
@@ -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()
index 48d20ef0c337dad5161ca53590ede44236f7b7f7..2a5236e9e5fae7e261ba0f44ff706d4611c5bbd1 100644 (file)
--- 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
index 969da2cc92000e2cead8b33d79be5f770c2b83ee..4a9dad8e32d03c11c2e74ea0c4b1ffd98019decc 100644 (file)
--- 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
 -----