2014-03-25 36 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()恢復。

希望這會有所幫助!

相關問題