当代码抛出 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()
我有一个 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()