“asseubRaises中的”issubclass()arg 2必须是一个类或元组

时间:2013-09-05 02:34:34

标签: python unit-testing

我有一个模块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)

这很好。是不是错误应该返回在引发时传递给它的消息?

1 个答案:

答案 0 :(得分:3)

不,它不应该像你期望的那样工作。第一个参数是一个类(或一个元组),第二个参数是可调用的,其余的是如in the documentation所述。

即使异常接受了参数,unittest也没有给出异常之间的深度比较(否则,说同一个类的两个独立实例是等价的将是相当复杂的。)

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

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

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

注意:上面我使用assertRaises()方法作为上下文管理器。当只给出一个参数时,它就像那样。有关详细信息,请访问mentioned documentation