我有一个试图导入模块的Python模块,如果失败,添加设置一个轻量级类来复制某些功能作为后备。
如何编写涵盖两种情况的单元测试 - 模块存在时和模块不存在时?
try:
from foo import bar
except ImportError:
class bar(object):
def doAThing(self):
return "blah"
例如,如果存在条形,则单元测试将报告仅覆盖第二条线,并且模块的其余部分不是。 Python的覆盖范围将报告"除了"到最后。
答案 0 :(得分: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
富/ __初始化__。PY
raise ImportError()