]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-150484: Fix mock_open __exit__ with contextlib.ExitStack (GH-151829) (GH...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 21 Jun 2026 17:02:30 +0000 (19:02 +0200)
committerGitHub <noreply@github.com>
Sun, 21 Jun 2026 17:02:30 +0000 (17:02 +0000)
  mock_open's _exit_side_effect had a fixed 3-arg signature, but
  contextlib.ExitStack calls __exit__ with 4 args (self + 3 exc info).
  Use *args to accept any number of arguments.
(cherry picked from commit 85fa295073a0291e517ae6bd24a26e03b5925b75)

Co-authored-by: Zang Peiyu <166481866+factnn@users.noreply.github.com>
Lib/test/test_unittest/testmock/testmock.py
Lib/unittest/mock.py
Misc/NEWS.d/next/Library/2026-05-28-00-00-00.gh-issue-150484.XxYyZz.rst [new file with mode: 0644]

index e1b108f81e513c12245f7f2593ff9175875e7449..ca4d808620703dd4fc76bdf31aeee413b405868a 100644 (file)
@@ -2101,6 +2101,15 @@ class MockTest(unittest.TestCase):
         self.assertEqual([], h.readlines())
         self.assertEqual([], h.readlines())
 
+    def test_mock_open_exit_with_contextlib_exit_stack(self):
+        # gh-150484: mock_open's __exit__ should work when called from
+        # contextlib.ExitStack, which passes (exctype, excinst, exctb).
+        from contextlib import ExitStack
+        with mock.patch('builtins.open', mock.mock_open()) as m:
+            with ExitStack() as exit_stack:
+                with exit_stack.enter_context(open('/tmp/test.txt', 'w')):
+                    pass
+
     def test_mock_parents(self):
         for Klass in Mock, MagicMock:
             m = Klass()
index bf32ff6dd3cd9c2161a8a82a5e32fc55edb43cb0..84f629ee1f76ac8b2bf49556f26e37aca3776da2 100644 (file)
@@ -2991,7 +2991,7 @@ def mock_open(mock=None, read_data=''):
             return handle.readline.return_value
         return next(_state[0])
 
-    def _exit_side_effect(exctype, excinst, exctb):
+    def _exit_side_effect(*args):
         handle.close()
 
     global file_spec
diff --git a/Misc/NEWS.d/next/Library/2026-05-28-00-00-00.gh-issue-150484.XxYyZz.rst b/Misc/NEWS.d/next/Library/2026-05-28-00-00-00.gh-issue-150484.XxYyZz.rst
new file mode 100644 (file)
index 0000000..522c700
--- /dev/null
@@ -0,0 +1 @@
+Fix :func:`unittest.mock.mock_open` ``__exit__`` raising ``TypeError`` when used with :class:`contextlib.ExitStack`.