如何Mock shutil.rmtree避免测试FileConverter时删除必要文件?
Mock shutil.rmtree 避免测试时删除真实文件
嘿,我来帮你搞定这个问题!要测试FileConverter.convert_files(rmv_src=True)但又不想真的删除文件,咱们用Python标准库的unittest.mock就能完美解决,完全不会影响其他依赖这些文件的测试用例。
下面是完整的测试实现,我会一步步给你讲清楚:
完整测试代码
import unittest from unittest.mock import patch, call from your_module import FileConverter # 记得替换成你的实际模块名 class TestFileConverter(unittest.TestCase): def setUp(self): # 先初始化测试用的转换器实例,用一个假路径就行 self.test_file_path = "/fake/test/directory" self.converter = FileConverter(self.test_file_path) @patch("shutil.rmtree") def test_convert_files_removes_source_when_asked(self, mock_rmtree): # 调用带rmv_src=True的方法 self.converter.convert_files(rmv_src=True) # 验证rmtree确实被调用了,而且参数是我们的测试路径 mock_rmtree.assert_called_once_with(self.test_file_path) def test_convert_files_leaves_source_when_not_asked(self): # 当rmv_src为False时,代码根本不会触发rmtree,所以不用mock self.converter.convert_files(rmv_src=False) # 这里可以加doStuff的验证逻辑,如果需要测试它的执行情况的话
核心细节解释
@patch装饰器的妙用:这个装饰器会在测试函数运行前,把shutil.rmtree替换成一个mock对象,测试结束后自动恢复原方法,完全不会影响其他测试用例的执行。- 验证mock调用:用
mock_rmtree.assert_called_once_with(...)可以确认代码确实触发了删除逻辑,而且参数正确——既保证了业务逻辑的正确性,又不会真的删掉文件。 - 无需mock的场景:当
rmv_src=False时,代码不会进入删除分支,所以直接测试就行,不用额外处理。
多测试用例的优化写法
如果你有多个测试需要mockrmtree,可以把mock的初始化和清理放到setUp和tearDown里,减少重复代码:
class TestFileConverter(unittest.TestCase): def setUp(self): self.test_file_path = "/fake/test/directory" self.converter = FileConverter(self.test_file_path) # 启动mock并保存引用 self.rmtree_patch = patch("shutil.rmtree") self.mock_rmtree = self.rmtree_patch.start() def tearDown(self): # 测试结束后恢复原方法 self.rmtree_patch.stop() def test_convert_files_triggers_delete(self): self.converter.convert_files(rmv_src=True) self.mock_rmtree.assert_called_once_with(self.test_file_path)
额外小提示
如果你的doStuff()函数也有外部依赖(比如读写文件、调用其他服务),同样可以用unittest.mock来mock它,这样测试就只专注于convert_files的逻辑,不会被其他外部操作干扰。
内容的提问来源于stack exchange,提问作者Manthan Jamdagni
相关产品推荐
相关产品推荐

