仅在执行mock.patch时触发ModuleNotFoundError:找不到my_module模块
报错原因
这个报错是mock.patch的路径解析规则和实际项目结构不匹配导致的:
mock.patch接收字符串格式的目标路径时,会按照Python标准模块导入规则逐级解析定位目标对象。你写的路径是'my_module.compute_something',框架会优先尝试导入my_module作为顶层模块,但你的项目里根本不存在这个顶层模块——my_module是my_package包内部的子模块,完整可导入路径是my_package.my_module,所以第一步导入就直接失败,抛出ModuleNotFoundError。- 你写的
unmocked函数能正常运行,是因为脚本顶部已经通过from my_package import my_module把模块对象加载到了当前脚本的内存命名空间里,后续调用走的是已有的对象引用,不需要重新触发导入流程,这和mock.patch独立的路径解析逻辑完全是两回事,所以不会出现报错。
修复方案
把mock.patch的目标路径补全为完整的可导入路径即可:
@mock.patch('my_package.my_module.compute_something') def mocked(mock_compute_something): mock_compute_something.return_value = 1 print(my_module.compute_something())
修改后重新运行脚本,就会输出符合预期的结果:
0 1
实用提示:使用
mock.patch时,永远要填写可以被Pythonimport语句正常解析的完整模块路径,不能只写你在当前文件导入时用的短名——哪怕你已经通过from 包名 import 模块名的方式拿到了对象引用,这个短名也不会成为全局可导入的模块路径,无法被mock框架正确解析。
内容的提问来源于stack exchange,提问作者Paul Coccoli
相关产品推荐
相关产品推荐

