2010-10-06 82 views
9

我想在Python中使用unittest做一個簡單的測試,看看如果一個類如果得到一個不適合的構造函數輸入的話就會拋出一個異常。這個類看起來是這樣的:在Python中測試 - 如何在使用unittest測試中使用assertRaises?

class SummaryFormula: 
    def __init__(self, summaryFormula): 
     self.atoms = {} 
     for atom in re.finditer("([A-Z][a-z]{0,2})(\d*)", summaryFormula): 
      symbol = atom.group(1) 
      count = atom.group(2) 

      if pocet != "": 
       self.atoms[ symbol] = int(count) 
      else: 
       self.atoms[ symbol] = 1 

我的測試如下:

class ConstructorTestCase(unittest.TestCase): 
     def testEmptyString(self): 
     self.assertRaises(TypeError, ukol1.SummaryFormula(), "testtest") 

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

所有我想要的是測試失敗,這意味着不合適輸入爲構造函數中的異常沒有被處理。

取而代之,我得到一個錯誤:__init__() takes exactly 2 arguments (1 given)

我錯過了什麼?我應該指定什麼第二個參數?

此外,我應該使用什麼類型的錯誤來處理異常,即我的正則表達式無法匹配的輸入傳遞給構造函數?

謝謝,托馬斯

+0

我不能直接運行的代碼,因爲是for循環附近的語法錯誤。你能糾正一下嗎? – pyfunc 2010-10-06 21:53:26

+0

我認爲循環的縮進不正確 – pyfunc 2010-10-06 21:56:13

+0

@pyfunc:對此抱歉。更正它。 – 2010-10-06 21:58:19

回答

12

那是因爲你的類需要一個參數,而實例化對象

,而你是通過

ukol1.SummaryFormula() 

你應該已經傳遞參數summaryFormula它。

ukol1.SummaryFormula(someSummaryFormula) 

而且混亂是因爲你的類名是SummaryFormula和你傳遞給__init__參數也SummaryFormula

或這應該是

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest") 
+0

這當然是我第一次嘗試,但如果我使用self.assertRaises(TypeError,ukol1.SummaryFormula(「testtest」),「testtest」),我得到其他錯誤:SummaryFormula實例氣沒有__call__方法。是不是你指定傳遞給在assertRaises中測試的函數的參數作爲assertRaises()函數的第三個(或第四,第五,...)參數? – 2010-10-06 21:51:57

+1

@Tomas Novotny:我在嘗試運行代碼時添加了第二個更改。在這裏重複:self.assertRaises(TypeError,ukol1.SummaryFormula,「testtest」) – pyfunc 2010-10-06 21:54:39

18

assertRaises是有點混亂,因爲你需要給它可調用的,而不是表達這個調用的表達式。

你的代碼更改爲:

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest") 

在你的代碼,你自己調用構造函數,它會引發你沒有足夠的論據例外。相反,您需要給assertRaises可調用(ukol1.SummaryFormula)以及用(「testtest」)調用它的參數。然後它可以調用它,捕獲並檢查異常。

2

一個更通用的替代格式是

args=['testtest'] 
kwargs = {} 
self.assertRaises(TypeError, ukol1.SummaryFormula, *args, **kwargs) 

這是有用的,如果你的構造函數是多態的,你要循環的誤寫的參數不同的方式列表,如:

arg_lists = [ 
    ['testtest'], 
    ['anothertest'], 
    ['YAT'], 
] 
for args in arg_lists: 
    self.assertRaises(TypeError, ukol1.SummaryFormula, *args) 
0

由於沒有其他的答案指向你如何使用它封裝引起異常的代碼,這裏是你如何能做到這一點的情況下。

with self.assertRaises(ValueError) as ctx: 
    <some code that throws an exception> 

expected_msg = 'foo_bar_baz' 
self.assertEquals(ctx.exception.message, expected_msg) 

感興趣的屬性在此unittest.case._AssertRaisesContext,分別是:

  • 例外
  • 預計
  • expected_regexp
  • failureException
相關問題