2014-03-25 32 views
3

我试图达到100%的测试覆盖率在我正在写的代码位。但是,下面的代码块给我带来了麻烦。我想导致一个ImportError

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

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

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

+4

'raise ImportError'怎么样? –

+0

我应该清楚,上面的代码是测试中的代码,我想在不修改该代码的情况下导致错误,而是从测试中导致错误。我将相应地编辑我的问题。 – Wilduck

+1

据我所知,你想强制该代码失败与'ImportError'。 –

回答

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]: 
+0

+1最佳答案。我删除了我的。 – That1Guy

+0

这正是我正在寻找的。我要给这个镜头。 – Wilduck

+1

我花了大量的时间试图让这个工作。它最终做到了,但我需要在修补程序上下文管理器中使用'reload(my_module_under_test)',以便在导入该文件时应用修补程序。有了这些额外的细节(随意编辑成这个答案),我接受这是我的问题的正确答案。非常感谢科斯! – Wilduck

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()恢复。

希望这会有所帮助!

相关问题