[Python-checkins] [3.9] bpo-42532: Check if NonCallableMock's spec_arg is not None instead of call its __bool__ function (GH-23613) (GH-23676)

tirkarthi webhook-mailer at python.org
Mon Dec 14 00:49:26 EST 2020


https://github.com/python/cpython/commit/14f2a124e20081b8981c8d6165dbd78d11b6808c
commit: 14f2a124e20081b8981c8d6165dbd78d11b6808c
branch: 3.9
author: Karthikeyan Singaravelan <tir.karthi at gmail.com>
committer: tirkarthi <tir.karthi at gmail.com>
date: 2020-12-14T11:19:16+05:30
summary:

[3.9] bpo-42532: Check if NonCallableMock's spec_arg is not None instead of call its __bool__ function (GH-23613) (GH-23676)

Check if NonCallableMock's spec_arg is not None instead of call its __bool__ function
(cherry picked from commit c598a04dd29b89ad072245ddaf738badcfb41ac7)

Co-authored-by: idanw206 <31290383+idanw206 at users.noreply.github.com>

files:
A Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst
M Lib/unittest/mock.py
M Lib/unittest/test/testmock/testmock.py

diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index b495a5f6ccc01..f03c88baca671 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -406,7 +406,7 @@ def __new__(cls, /, *args, **kw):
             # Check if spec is an async object or function
             bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments
             spec_arg = bound_args.get('spec_set', bound_args.get('spec'))
-            if spec_arg and _is_async_obj(spec_arg):
+            if spec_arg is not None and _is_async_obj(spec_arg):
                 bases = (AsyncMockMixin, cls)
         new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
         instance = _safe_super(NonCallableMock, cls).__new__(new)
diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py
index ce674e713e99c..f9307245307b9 100644
--- a/Lib/unittest/test/testmock/testmock.py
+++ b/Lib/unittest/test/testmock/testmock.py
@@ -2156,6 +2156,16 @@ def trace(frame, event, arg):  # pragma: no cover
                 obj = mock(spec=Something)
                 self.assertIsInstance(obj, Something)
 
+    def test_bool_not_called_when_passing_spec_arg(self):
+        class Something:
+            def __init__(self):
+                self.obj_with_bool_func = unittest.mock.MagicMock()
+
+        obj = Something()
+        with unittest.mock.patch.object(obj, 'obj_with_bool_func', autospec=True): pass
+
+        self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst
new file mode 100644
index 0000000000000..7465cb8e2e3d7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst
@@ -0,0 +1 @@
+Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument to a Mock.



More information about the Python-checkins mailing list