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

How can I unit test when code throws an ImportError?

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

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

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

例如,如果 bar 存在,单元测试将报告仅第 2 行被覆盖,模块的其余部分未被覆盖。 Python 的覆盖范围将在 "except" 行中报告缺失的测试。

模块从 sys.path 数组加载。如果清除该数组,则任何非核心导入都将失败。以下命令是 运行 in 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

foo/__init__.py

raise ImportError()