2012-08-10 101 views
2

我需要測試我的python代碼是否有異常,但我似乎無法獲得正確的語句來運行。
當我測試的生產代碼,我可以看到異常被拋出,但是當我在我的單元測試文件來測試這個例外,我得到這個:使用pyunit測試Python中的異常

testincorrectparam (unittestearnings.TestEarningsArgs) 
should raise error when param not an integer ... "3v" is not a valid argument. i should be an integer 
ERROR 

我通過類似的問題對SO讀,但我只是不「T設法找到我的問題一個滿意的答案..

生產代碼如下所示:

class Earnings(): 

    def printd(i=0): 

     try: 
      i = int(i) 

     except Exception: 
      print('"' + i + '"' + " is not a valid argument. i should be an integer") 
      sys.exit(0) 

而且單元測試代碼是這樣的:

from earnings import Earnings 
import unittest 

class TestEarningsArgs(unittest.TestCase): 

    def testincorrectparam(self): 
     '''should raise error when param not an integer''' 
     e = Earnings() 
     value = "3v" 
     self.assertRaises(Exception, e.printd(i=value)) 

if __name__ == "__main__": 
     unittest.main() 

真的很感謝任何幫助。

+0

請注意,'printd()'不採取「參數」n amed參數,所以你的測試或代碼在這裏也是不正確的。 – geoffspear 2012-08-10 15:08:43

+0

@Wooble感謝您發現這一點,代碼現在一致。然而,我的問題仍然有效。乾杯 – jule64 2012-08-10 17:25:24

回答

1

問題是,捕獲異常,它不會傳播到unittest。您需要刪除try-except語句並保留i = int(i)。在這種情況下,異常將被提出,並且assertRaises將自己捕獲它。

另一個問題是你的代碼中的sys.exit(0)行。您需要將其替換爲引發異常(...),因爲異常類不是特定的異常(您應該針對您期望發生錯誤的情況提出更具體的異常)。

+0

Rostyslav謝謝你的評論幫助我解決了我的問題。我現在要發佈解決方案。不幸的是,由於我沒有必要的資歷,我無法對您的評論贊不絕口。 – jule64 2012-08-10 17:27:05

+0

只需接受答案)Upvote不是必需的。 – 2012-08-10 18:34:47

0

raise

+1

...並且您應該嘗試在您的try子句中捕獲ValueError而不是Exception。 – Meitham 2012-08-10 14:02:57

+0

謝謝。我決定提出一個自定義的異常,而不是基於我在「深入Python」中找到的很好的例子。乾杯 – jule64 2012-08-10 17:32:34

0

更換sys.exit(0)我試圖瞭解在Python單元測試,我認爲assertRaise的一般形式是

TestCase.assertRaises(Exception, callable, parameter1,parameter2,...) 

所以請儘量

self.assertRaises(Exception, e.printd,i=value) 

希望它會爲工作你