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

时间:2015-02-02 09:21:31

标签: python unit-testing nose nosetests

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

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

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

例如,如果存在条形,则单元测试将报告仅覆盖第二条线,并且模块的其余部分不是。 Python的覆盖范围将报告"除了"到最后。

1 个答案:

答案 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()