繁体   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