在单元测试中修补本地 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 的贡献者。