You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:56:32