如何Patch Path对象以覆盖st_mtime不等分支的执行路径?
如何Mock Path对象触发st_mtime变化的执行路径
要触发if file_path.stat().st_mtime != previous_time的分支,核心是让两次调用file_path.stat().st_mtime返回不同的值。关键在于mock Path.stat()方法的返回值——因为st_mtime是stat()返回对象的属性,而非Path本身的属性,直接mock st_mtime的方式并不生效。
以下是两种可行的实现方案:
方案1:用MagicMock设置st_mtime的side_effect
from unittest.mock import patch, MagicMock from pathlib import Path # 假设你的生产逻辑封装在这个函数中 def target_function(file_path): previous_time = file_path.stat().st_mtime # 此处省略文件重建逻辑 if file_path.stat().st_mtime != previous_time: return "XXXXX执行完成" # 用于验证分支是否触发 return "XXXXX未执行" def test_trigger_branch(): with patch.object(Path, 'stat') as mock_stat: # 创建mock的stat结果对象,给st_mtime设置顺序返回值 stat_result_mock = MagicMock() stat_result_mock.st_mtime = MagicMock(side_effect=[1, 33]) # 让Path.stat()每次调用都返回这个mock对象 mock_stat.return_value = stat_result_mock # 执行测试 result = target_function(Path("test_file.txt")) assert result == "XXXXX执行完成"
方案2:用PropertyMock模拟st_mtime属性
from unittest.mock import patch, PropertyMock from pathlib import Path def target_function(file_path): previous_time = file_path.stat().st_mtime # 此处省略文件重建逻辑 if file_path.stat().st_mtime != previous_time: return "XXXXX执行完成" return "XXXXX未执行" def test_trigger_branch(): with patch.object(Path, 'stat') as mock_stat: # 用PropertyMock模拟st_mtime的顺序返回值 st_mtime_mock = PropertyMock(side_effect=[1, 33]) # 给stat返回的对象绑定st_mtime属性 mock_stat.return_value.st_mtime = st_mtime_mock result = target_function(Path("test_file.txt")) assert result == "XXXXX执行完成"
关键说明
- 必须先mock
Path.stat()方法,让它返回自定义的mock对象,而非直接mock Path类的st_mtime属性(因为st_mtime不属于Path本身)。 - 通过
side_effect=[1,33]让两次调用st_mtime返回不同值,满足分支条件,从而触发# do XXXXX的执行路径。
内容的提问来源于stack exchange,提问作者AdR
相关产品推荐
相关产品推荐

