我试图在我写的一些代码中达到100%的测试覆盖率。但是,下面的代码块给了我麻烦。
try:
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^localized_recurrence\.duration_field\.DurationField"])
except ImportError:
pass
上面的代码是我测试模块的一部分。我需要在ImportError
分支之后创建一个测试(不修改上面的代码)。
我如何以编程方式导致ImportError
发生,而只在我的测试中编写代码?
答案 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}}。
希望这有帮助!