我有一个模块InvalidObj

class InvalidObj(Exception):

    def__init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)

class Hello(object):

    def __init__(self):
        self.a = 10
        self.b = 20

    def aequalb(self):
        if self.a != self.b:
            raise InvalidObj("This is an error")


我正在尝试做一个单元测试,其中一个函数抛出InvalidObj异常

class test_obj(unittest.TestCase):

    def test_obj(self):
        at = Hello()
        self.assertRaises(InvalidObj("This is an error"), a.aequalb)


运行上面的test_obj类时,它给我一个错误“ issubclass()arg 2必须是类或元组”。但是如果我改成

self.assertRaises(InvalidObj, at.aequalb)


运行良好。错误不是应该在引发错误时返回传递给它的消息吗?

最佳答案

不,它不应该按您预期的方式工作。第一个参数是一个类(或元组),第二个参数是可调用的,其余参数如in the documentation所述。

即使异常接受参数,unittest也不能为您提供异常之间的深入比较(否则,说同一个类的两个单独的实例是等效的,这将非常复杂)。

要解决您的问题,只需单独测试属性:

with self.assertRaises(InvalidObj) as cm:
    at.aequalb()

self.assertEqual("This is an error", cm.exception.value)


注意:上面我已经使用assertRaises()方法作为上下文管理器。当仅给出一个参数时,它的行为就是这样。有关更多详细信息,请访问mentioned documentation

10-08 00:30