From 3f7c0810f6158a7ff37be432f8d7f9511427489f Mon Sep 17 00:00:00 2001 From: Samet YASLAN Date: Sun, 11 Jun 2023 20:51:21 +0200 Subject: bpo-44185: Added close() to mock_open __exit__ (#26902) --- Lib/test/test_unittest/testmock/testwith.py | 6 +++--- Lib/unittest/mock.py | 4 ++++ Misc/NEWS.d/next/Library/2021-06-24-20-45-03.bpo-44185.ZHb8yJ.rst | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-06-24-20-45-03.bpo-44185.ZHb8yJ.rst diff --git a/Lib/test/test_unittest/testmock/testwith.py b/Lib/test/test_unittest/testmock/testwith.py index 8dc8eb1..56cb163 100644 --- a/Lib/test/test_unittest/testmock/testwith.py +++ b/Lib/test/test_unittest/testmock/testwith.py @@ -158,7 +158,7 @@ class TestMockOpen(unittest.TestCase): f.read() expected_calls = [call('foo'), call().__enter__(), call().read(), - call().__exit__(None, None, None)] + call().__exit__(None, None, None), call().close()] self.assertEqual(mock.mock_calls, expected_calls) self.assertIs(f, handle) @@ -172,9 +172,9 @@ class TestMockOpen(unittest.TestCase): expected_calls = [ call('foo'), call().__enter__(), call().read(), - call().__exit__(None, None, None), + call().__exit__(None, None, None), call().close(), call('bar'), call().__enter__(), call().read(), - call().__exit__(None, None, None)] + call().__exit__(None, None, None), call().close()] self.assertEqual(mock.mock_calls, expected_calls) def test_explicit_mock(self): diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 4ca7062..f10f9b0 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2941,6 +2941,9 @@ def mock_open(mock=None, read_data=''): return handle.readline.return_value return next(_state[0]) + def _exit_side_effect(exctype, excinst, exctb): + handle.close() + global file_spec if file_spec is None: import _io @@ -2967,6 +2970,7 @@ def mock_open(mock=None, read_data=''): handle.readlines.side_effect = _readlines_side_effect handle.__iter__.side_effect = _iter_side_effect handle.__next__.side_effect = _next_side_effect + handle.__exit__.side_effect = _exit_side_effect def reset_data(*args, **kwargs): _state[0] = _to_stream(read_data) diff --git a/Misc/NEWS.d/next/Library/2021-06-24-20-45-03.bpo-44185.ZHb8yJ.rst b/Misc/NEWS.d/next/Library/2021-06-24-20-45-03.bpo-44185.ZHb8yJ.rst new file mode 100644 index 0000000..056ab8d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-06-24-20-45-03.bpo-44185.ZHb8yJ.rst @@ -0,0 +1,3 @@ +:func:`unittest.mock.mock_open` will call the :func:`close` method of the file +handle mock when it is exiting from the context manager. +Patch by Samet Yaslan. -- cgit v0.12