我想引起一个ImportError

时间:2014-03-25 14:36:58

标签: python unit-testing

我试图在我写的一些代码中达到100%的测试覆盖率。但是,下面的代码块给了我麻烦。

try:
    from south.modelsinspector import add_introspection_rules
    add_introspection_rules([], ["^localized_recurrence\.duration_field\.DurationField"])
except ImportError:
    pass

上面的代码是我测试模块的一部分。我需要在ImportError分支之后创建一个测试(不修改上面的代码)。

我如何以编程方式导致ImportError发生,而只在我的测试中编写代码?

2 个答案:

答案 0 :(得分:6)

我尝试修补sys.modules并用模拟模块替换south.modelsinspector

请参阅the docs on Import statement获取灵感。

In [1]: from re import sub

In [2]: import sys

In [3]: sys.modules['re'] = {}

In [4]: from re import sub
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/home/kos/codility/frontend_v2/<ipython-input-4-6d4794835d43> in <module>()
----> 1 from re import sub

ImportError: cannot import name sub

您可以使用mock.patch.dict(作为测试装饰器或上下文管理器)在狭窄的上下文中执行此操作:

In [6]: with mock.patch.dict('sys.modules', {'re': {}}):
            from re import sub
   ...:     
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-6-7479025ab931> in <module>()
      1 with mock.patch.dict('sys.modules', {'re': {}}):
----> 2     from re import sub
      3 

ImportError: cannot import name sub

In [8]: from re import sub

In [9]: 

答案 1 :(得分:3)

您可以更改sys.path进行测试。例如:

>>>import bs4
>>>

>>>import sys
>>>p=sys.path
>>>sys.path=['']
>>>import bs4

ImportError: No module named bs4

>>>sys.path=p
>>>import bs4
>>>

只需修改sys.path上的setUp(),然后tearDown()再修改{{1}}。

希望这有帮助!