2013-02-08 52 views
3

我有一個這樣的代碼:如何在python中模擬異常調用?

def extract(data): 
    if len(data) == 3: 
     a = 3 
    else: 
     component = data.split("-") 
     if len(component) == 3: 
      a,b,c = component 
     else: 
      raise globals.myException("data1", "Incorrect format", data) 

    return a,b,c 

這是一個簡化的。我想模擬異常類globals.myException。我做的是:

def test_extract_data_throws_exception(self): 
     with patch('globals.myException') as mock: 
      mock.__init__("data1", "Incorrect format", "") 
      with self.assertRaises(myException): 
       self.assertEqual(extract(""), ("")) 

,我總是得到錯誤:「類型錯誤:例外必須是老式類或BaseException衍生,沒有MagicMock」

編輯:由於@Aaron Digulla建議,猴子補丁是正確的解決方案。我發佈解決方案來幫助他人。

def test_extract_data_throws_exception(self): 
     #monkey patching 
     class ReplaceClass(myException): 
      def __init__(self, module, message, detail = u''): 
       pass 

     globals.myException = ReplaceClass 
     with self.assertRaises(myException: 
      self.assertEqual(extract(""), ("")) 
+0

爲什麼你想嘲笑異常?爲什麼不簡單地把它扔到測試中呢? –

+0

MyException從Exception擴展,但增加了一些funcionality作爲Log服務和其他東西。我知道我可以包括我的例外作爲我的測試的一部分,但我想保持清潔我的單元測試。此外,這是一個好奇的問題:) – Killrazor

回答

4

原因是raise檢查參數的類型。它必須是一個字符串(a.k.a「舊式例外」)或衍生自BaseException

由於模擬不是,raise拒絕使用它。

在這種情況下,您必須提出例外或使用monkey patching(=覆蓋測試中的符號globals.myException,然後再恢復)。

+0

感謝您的幫助。我已經使用猴子補丁發佈瞭解決方案。 – Killrazor

+0

您需要在測試後恢復原始值! –

+0

是的,我爲此創建了一個特殊類! – Killrazor