Python os模块remove函数调用验证测试失败及Mock问题排查
问题原因及修复方案
你的测试失败有两个关键原因:
1. 拼写错误导致Mock返回值未正确设置
代码里把return_value拼成了return_vallue(多了一个字母l),这导致mock_path.exists的返回值始终是Mock对象的默认布尔值True,所以第一次调用rm()时,会执行os.remove,触发断言失败。
2. Patch的目标路径错误
在os_mock.py中,你直接导入了os模块并使用其方法,因此需要patch被测试模块(os_mock)中的os引用,而不是全局的os模块。unittest.mock的patch遵循"where it is used"原则,必须patch对象被调用的位置,而不是定义的位置。
修复后的测试代码
import unittest from unittest.mock import patch from os_mock import MyTestMock class TestMyTestMock(unittest.TestCase): @patch('os_mock.os.path.exists') @patch('os_mock.os.remove') def test_rm(self, mock_remove, mock_exists): my_test_mock = MyTestMock() # 设置exists返回False mock_exists.return_value = False my_test_mock.rm() self.assertFalse(mock_remove.called) # 重置mock状态,避免上次调用影响 mock_remove.reset_mock() # 设置exists返回True mock_exists.return_value = True my_test_mock.rm() self.assertTrue(mock_remove.called)
额外优化说明
- 单独patch
os.path.exists而非整个os.path,更精准,避免影响其他os.path方法 - 每次测试分支后调用
mock_remove.reset_mock(),清除之前的调用记录,确保第二个断言不受第一次调用的干扰
内容的提问来源于stack exchange,提问作者Vidya
相关产品推荐
相关产品推荐

