2014-02-26 47 views
1

我有一個小代碼如下,請幫助我如何以正確的方式編寫此代碼。我想檢查ID是否存在於value中,如果不存在,則會引發異常。Python self.assertRaises

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'}) 

with self.assertRaises(IndexError, value[0]["ID"]): 
    print "not an error" 
+1

FWIW,代碼中引發了錯誤的理由,'({...})'是不是1字典,它只是一個字典(有一些額外的括號),你需要'({...},' – SingleNegationElimination

回答

5

問題與您的代碼是value[0]["ID"]只是一個武斷的說法,並在Python參數執行函數調用之前進行評估。所以在你的情況下,assertRaises沒有機會攔截錯誤,因爲它沒有被調用。

我猜你正在尋找這個片段中,如果你想堅持使用上下文管理爲基礎的方法,你需要一次評估陳述或多個表達式是在情況下非常有用:

with self.assertRaises(IndexError): 
    value[0]["ID"] 

或者你可以以這種方式工作,如果您需要解決單個表達式(報表不會lambda表達式工作):

self.assertRaises(IndexError, lambda: value[0]["ID"]) 

有關此更多的信息,看看this question,因爲它看似解決您的問題,關於如何正確使用assertRaises

也請你的情況注意value只是字典,而不是元組,儘管括號 - 爲了使value單元素元組,使用foo = (bar,)語法 - 需要尾隨昏迷從優先覆蓋括號來區分,像(2 + 2) * 3

此外,在單元測試你不一般需要與您的斷言狀態輸出任何東西 - 如果它通過或不通過它的單元測試框架的工作,以形成相應的報告。但是,如果你願意打印它,只需在斷言後包含print() - 因爲如果斷言失敗,測試將停止運行,並且控制將不會達到您的print()

+0

好吧謝謝你的迴應。我會嘗試並回復你。 – user2511126

+0

我試過使用它:它仍然不能正常工作,它拋出一個錯誤。 self.assertRaises(IndexError,拉姆達:值[0] [「ID」]) – user2511126

+0

「值」包含一個數組,我並不擔心在最後的打印。我只想使用self.assertRaises函數來評估數組是否包含ID。 – user2511126

1

在你沒有在assertRaises方法堅持的話,我寧願選擇assertIn

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'}) 
self.assertIn('ID', value) 
相關問題