[英]Passing exceptions across classes while unit-testing in Python
假定兩個Python類,其中第一個( Class 1 )包含一個函數( function_c1 ),該函數包含一些語句( some_statement ),如果為true,則返回自定義異常( MyException )。 進一步假設第二類( Class 2 )執行第一類,並希望傳遞定制的異常(即,返回相同的異常本身)。 以下代碼說明了這種情況:
class Class1:
''' My nifty class 1. '''
def __init__(self):
pass
def function_c1(self, some_input):
''' A function of class 1. '''
if some_statement(some_input):
return MyException('Some error message.')
return True
class Class2:
''' My nifty class 2. '''
def __init__(self):
pass
def function_c2(self, some_input):
''' A function of class 2. '''
my_handle = Class1()
try:
my_handle.function_c1(some_input)
except MyException as e:
return MyException(e)
return True
為什么無論Class 1是否返回異常,Class 2為什么都返回' True '?
編輯1 :在上面的示例中,我故意選擇return
而不是raise
異常,以使類1適用於單元測試。
self.assertRaises(Class1().function_c1(some_input))
鑒於我的Python誠然不完全理解,我看到的只有兩個選擇吃蛋糕(即進行單元測試),並保持它太(即,具有2級接收來自1類除外):(一)我要么raise
作為以及在類1中return
MyException(如果可能的話?),或(b)我使用了另一個assert
語句。
編輯2 :感謝一些出色的反饋,我現在知道我的最初錯誤是由於錯誤使用assertRaises
導致的。 它應按以下方式使用:
class MyException(Exception):
pass
class Class1:
...
with self.assertRaises(MyException):
Class1().function_c1(some_input)
但是,只有在Class 1引發了諸如ValueError
類的內置異常(並因此with self.assertRaises(ValueError):
使用with self.assertRaises(ValueError):
時,單元測試才會通過。 我的用戶定義的異常MyException仍未通過單元測試。 為什么會這樣呢?
為了使異常可捕獲,您必須raise
它。 如果return
它,則異常的行為與其他任何python對象一樣(並且不會被try
塊捕獲。
class Class1:
''' My nifty class 1. '''
def __init__(self):
pass
def function_c1(self, some_input):
''' A function of class 1. '''
if some_statement(some_input):
raise MyException('Some error message.')
return True
為了解決您在下面的評論,對於使用python的unittest模塊進行單元測試,您可能會執行以下操作:
with self.assertRaises(MyException):
Class1().function_c1(...)
如果您停留在python2.7之前的環境中,則可能是:
self.assertRaises(MyException, Class1().function_c1, ...)
但是為了您的方便,我希望您至少可以使用python2.7 :-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.