]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] bpo-38157: Add example about per file output for mock_open. (GH-16090) (#109071)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 8 Sep 2023 13:21:51 +0000 (06:21 -0700)
committerGitHub <noreply@github.com>
Fri, 8 Sep 2023 13:21:51 +0000 (15:21 +0200)
bpo-38157: Add example about per file output for mock_open. (GH-16090)
(cherry picked from commit e183a71eef1ec3ac86bb4d81a158c21d6f1a783b)

Co-authored-by: Karthikeyan Singaravelan <tir.karthi@gmail.com>
Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
Doc/library/unittest.mock-examples.rst

index 744fc9de63cd1688f7bc487beb57e830381a6407..34f343ebacdbb76e90fb0cd11c8372309ac595d9 100644 (file)
@@ -360,6 +360,30 @@ of arbitrary attributes as well as the getting of them then you can use
 *spec_set* instead of *spec*.
 
 
+Using side_effect to return per file content
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:func:`mock_open` is used to patch :func:`open` method. :attr:`~Mock.side_effect`
+can be used to return a new Mock object per call. This can be used to return different
+contents per file stored in a dictionary::
+
+   DEFAULT = "default"
+   data_dict = {"file1": "data1",
+                "file2": "data2"}
+
+   def open_side_effect(name):
+       return mock_open(read_data=data_dict.get(name, DEFAULT))()
+
+   with patch("builtins.open", side_effect=open_side_effect):
+       with open("file1") as file1:
+           assert file1.read() == "data1"
+
+       with open("file2") as file2:
+           assert file2.read() == "data2"
+
+       with open("file3") as file2:
+           assert file2.read() == "default"
+
 
 Patch Decorators
 ----------------