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

如何测试缺失可选依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:13:16