如何测试缺失可选依赖pandas时的导入异常处理逻辑?
为啥测试没触发导入异常?
Python会把已导入的模块缓存到sys.modules字典里,哪怕你清空了sys.path,执行import pandas时会直接从缓存中读取已加载的模块,不会重新去路径里查找,自然不会触发ImportError或ModuleNotFoundError。
修正后的测试方案
你需要先清除pandas的模块缓存,或者直接模拟pandas未安装的状态,再重新加载my_submodule,让顶部的try-except逻辑重新执行。
方案一:清理缓存+重新加载
from unittest.mock import patch import sys import importlib def test_no_pandas_import(): # 删除sys.modules中所有pandas相关的缓存条目 for key in list(sys.modules.keys()): if key.startswith('pandas'): del sys.modules[key] # 清空路径并重新导入、加载子模块 with patch('sys.path', []): import my_module.my_submodule importlib.reload(my_module.my_submodule) assert my_module.my_submodule.pd is None
方案二:直接模拟pandas未安装
from unittest.mock import patch import importlib def test_no_pandas_import(): # 用patch.dict修改sys.modules,模拟pandas不存在的状态 with patch.dict('sys.modules', {'pandas': None}): import my_module.my_submodule importlib.reload(my_module.my_submodule) assert my_module.my_submodule.pd is None
关键注意事项
- 如果测试代码执行前
my_submodule已经被导入过,必须用importlib.reload()重新加载模块,否则顶部的try-except代码块不会再次执行。 - Python模块查找的优先级:先检查
sys.modules缓存,再遍历sys.path中的路径,因此仅清空sys.path无法触发导入异常。
内容的提问来源于stack exchange,提问作者mosc9575
相关产品推荐
相关产品推荐

