文件重命名 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 的贡献者。
我有一个功能可以重命名目录中的文件并另存为新文件。我是通过以下方式完成的。
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 的贡献者。