触发ImportError以测试回退代码的覆盖范围

时间:2011-09-15 17:56:38

标签: python testing code-coverage importerror

somemod.py中给出这样的代码:

try:
    Import cStringIO as StringIO
except ImportError:
    import StringIO

如何测试'后备'分支?

(使用案例:试图达到100%的覆盖率。同意这是一个有点愚蠢的目标:))

并发症

  1. 代码从test_somemod.py运行import somemod
  2. Mocking ImportError in Python涵盖了部分内容,但很复杂!

1 个答案:

答案 0 :(得分:1)

首先,创建一个用于测试的函数:

>>> def somecode():
...    try:
...       import cStringIO as StringIO
...       print 'got cStringIO'
...    except ImportError:
...       import StringIO
...       print 'got StringIO'
>>> somecode()
got cStringIO

现在,正如here所解释的那样,您可以访问导入功能:

>>> import __builtin__
>>> original_import = __builtin__.__import__
>>> def import_hook(name, *args, **kwargs):
...    if name == 'cStringIO': raise ImportError('test case module import failure')
...    else: return original_import(name, *args, **kwargs)
... 
>>> 
>>> __builtin__.__import__ = import_hook
>>> somecode()
got StringIO

在测试用例之后,您应该将其设置回来:

>>> __builtin__.__import__ = original_import