在单元测试中修补本地 JSON 文件
Patching over local JSON file in unit testing
我有一些 Python 代码加载到本地 JSON 文件中:
with open("/path/to/file.json") as f:
json_str = f.read()
# Now do stuff with this JSON string
在测试中,我想将 JSON 文件修补为位于我的存储库测试目录 ("/path/to/repo/test/fake_file.json"
) 中的 JSON 文件。
我该怎么做?
另一个要求是我实际上在本地有一个 "/path/to/file.json"
版本,但我不想更改它。我希望它在测试时修补,并在测试完成时取消修补。
注:我用的是pytest
,好像插件pyfakefs
会做这个。可悲的是,我不知道如何让它在另一个本地文件中打补丁(从我的 repo 的测试目录中)。我对使用 vanilla Python 3.10+ and/or pyfakefs
.
的解决方案持开放态度
使用pyfakefs
,您可以map real files into the fake file system. In your case, you can use add_real_file:
def test_json(fs):
fs.add_real_file("/path/to/repo/test/fake_file.json",
target_path="/path/to/file.json")
assert os.path.exists("/path/to/file.json")
这会将您现有的文件映射到假文件系统中的 target_path
(如果未提供 target_path
,它将把它映射到与源文件相同的位置)。
同一位置是否有真实文件并不重要,因为真实文件系统将在假文件系统中被忽略。如果您在测试代码中读取 "/path/to/file.json"
,它实际上将读取 "/path/to/repo/test/fake_file.json"
(映射文件仅按需读取)。
请注意,默认情况下文件映射为只读,因此如果您想在测试代码中更改它,则必须在映射调用中设置 read_only=False
。这将使假文件系统中的文件可写,当然,写入它不会触及真实文件系统中的文件。
免责声明:
我是 pyfakefs 的贡献者。
我有一些 Python 代码加载到本地 JSON 文件中:
with open("/path/to/file.json") as f:
json_str = f.read()
# Now do stuff with this JSON string
在测试中,我想将 JSON 文件修补为位于我的存储库测试目录 ("/path/to/repo/test/fake_file.json"
) 中的 JSON 文件。
我该怎么做?
另一个要求是我实际上在本地有一个 "/path/to/file.json"
版本,但我不想更改它。我希望它在测试时修补,并在测试完成时取消修补。
注:我用的是pytest
,好像插件pyfakefs
会做这个。可悲的是,我不知道如何让它在另一个本地文件中打补丁(从我的 repo 的测试目录中)。我对使用 vanilla Python 3.10+ and/or pyfakefs
.
使用pyfakefs
,您可以map real files into the fake file system. In your case, you can use add_real_file:
def test_json(fs):
fs.add_real_file("/path/to/repo/test/fake_file.json",
target_path="/path/to/file.json")
assert os.path.exists("/path/to/file.json")
这会将您现有的文件映射到假文件系统中的 target_path
(如果未提供 target_path
,它将把它映射到与源文件相同的位置)。
同一位置是否有真实文件并不重要,因为真实文件系统将在假文件系统中被忽略。如果您在测试代码中读取 "/path/to/file.json"
,它实际上将读取 "/path/to/repo/test/fake_file.json"
(映射文件仅按需读取)。
请注意,默认情况下文件映射为只读,因此如果您想在测试代码中更改它,则必须在映射调用中设置 read_only=False
。这将使假文件系统中的文件可写,当然,写入它不会触及真实文件系统中的文件。
免责声明:
我是 pyfakefs 的贡献者。