簡體   English   中英

在Python中進行單元測試時跨類傳遞異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM