文件重命名 pytesting mocker.patch

File Rename pytesting with mocker.patch

我有一个功能可以重命名目录中的文件并另存为新文件。我是通过以下方式完成的。

def function(input_d):
   for file in os.listdir(input_d):
       if file.startswith('copy_'):
          new_file = file.split("_")[-1]
          os.rename(os.path.join(input_d,file),os.path.join(input_d,new_file))
   return input_d

我想使用 mocker.patch 来测试我的功能,但我刚开始使用 pytest,无法这样做。

在你的例子中,如果你想测试文件是否被重命名,你必须以某种方式记录重命名。这可以通过使用执行此操作的函数模拟 os.rename 来完成。此外,必须将 os.listdir 模拟为 return 所需的值。这是一个示例实现:

import os

from your_module.sut import function

def test_rename(mocker):
    renames = {}

    def fake_rename(old, new):
        renames[old] = new

    mocker.patch("os.listdir", return_value=("foo.txt", "copy_bar.txt"))
    mocker.patch("os.rename", fake_rename)
    function("my_dir")
    assert len(renames) == 1
    old_path = os.path.join("my_dir", "copy_bar.txt")
    assert old_path in renames
    assert renames[old_path] == os.path.join("my_dir", "bar.txt")

请注意,测试本身是不够的(如果文件已经存在会怎样?),但这取决于您。

另一种测试方法是使用假文件系统(在内存中创建的文件系统)。如果您正在测试许多与文件系统相关的功能,这通常是有意义的。如果使用 pyfakefs 提供的 fs 夹具,相同的测试可能如下所示:

import os

from your_module.sut import function

def test_rename(fs):
    fs.create_file("my_dir/foo.txt")
    fs.create_file("my_dir/copy_bar.txt")
    function("my_dir")
    assert os.path.exists("my_dir/foo.txt")
    assert os.path.exists("my_dir/bar.txt")

免责声明:
我是 pyfakefs 的贡献者。