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

pytest中使用Patch模拟fetch_aws_secret函数无效问题排查

问题根源:Patch路径错误

你遇到的模拟失效核心原因是unittest.mock.patch的目标路径不对——patch需要针对被测试代码实际导入并使用的函数引用,而非原始模块的路径。

具体场景拆解

你的项目结构大致是:

├── scripts/
│   └── aws_secrets.py
└── status_update/
    ├── lib/
    │   └── sync_mdl_status.py
    └── tests/
        └── test_status_update.py

在status_update/lib/sync_mdl_status.py里,你应该是通过类似下面的方式导入函数:

from scripts.aws_secrets import fetch_aws_secret

此时fetch_aws_secret会被复制到status_update.lib.sync_mdl_status的命名空间中,后续update_mdl_status调用的是这个本地引用,而非直接调用scripts.aws_secrets.fetch_aws_secret。

你之前用@patch('scripts.aws_secrets.fetch_aws_secret')只patch了原始模块里的函数,但被测试代码用的是自己命名空间里的引用,所以模拟完全没生效。

修正方案

把patch的目标路径改成被测试模块中实际使用的那个引用路径:

from unittest.mock import patch
from status_update.lib.sync_mdl_status import update_mdl_status

# 重点:patch的是sync_mdl_status模块里的fetch_aws_secret引用
@patch('status_update.lib.sync_mdl_status.fetch_aws_secret')
def test_update_mdl_status(mock_fetch):
    # 设置mock返回值
    mock_fetch.return_value = {"db_password": "test_pass"}
    # 执行测试逻辑
    update_mdl_status()
    # 验证mock被正确调用
    mock_fetch.assert_called_once()

额外提示

如果你的测试文件用相对导入(比如from ..lib.sync_mdl_status import update_mdl_status),也可以用相对路径patch,比如@patch('..lib.sync_mdl_status.fetch_aws_secret'),但绝对路径更不容易出错,尤其是项目结构复杂的时候。

内容的提问来源于stack exchange,提问作者Sagar Ghanwat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:30:59