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
相关产品推荐
相关产品推荐

