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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:29