首页 文章

当代码抛出ImportError时,我如何进行单元测试?

提问于
浏览
2

我有一个Python模块试图导入一个模块,如果它失败,添加设置一个轻量级类来复制一些功能作为后备 .

如何编写涵盖两种情况的单元测试 - 模块存在时和模块不存在时?

try:
    from foo import bar
except ImportError:
    class bar(object):
        def doAThing(self):
            return "blah"

例如,如果存在bar,则单元测试将报告仅覆盖第二行,而模块的其余部分则不会 . Python的报道将在线路上报告缺少的测试,其中“except”到最后 .

1 回答

  • 2

    模块从 sys.path 数组加载 . 如果清除该阵列,则任何非核心导入都将失败 . 以下命令在ipython中的虚拟环境中运行,可以访问django

    import sys
    
    sys.path = []
    
    import django
    ... ImportError ...
    
    import os
    ... No ImportError ...
    

    您的另一种选择是使用两个虚拟环境 . 一个有模块,一个没有 . 这会使运行测试稍微困难一些 .

    如果这不起作用,那么你可以添加一个路径到 sys.path 的开头,该路径有一个模块,在加载时会产生 ImportError . 这是有效的,因为加载了搜索 sys.path 时找到的第一个匹配项,因此可以替换实际模块 . 以下就足够了:

    test.py

    import sys
    sys.path.insert(0, '.')
    
    import foo
    

    富/ __ init__.py

    raise ImportError()
    

相关问题