6

我有代码,当 assertRaises 失败时,assertRaises 会抛出异常。我认为如果 assertRaises 失败,那么测试就会失败,最后我会得到一份报告说测试失败。我没想到会抛出异常。下面是我的代码。我做错了什么?我正在使用 Python 2.6.2。

import unittest

class myClass:

    def getName(self):

        raise myExcOne, "my exception one"
        #raise myExcTwo, "my exception two"
        #return "a"

class myExcOne(Exception):
    "exception one"

class myExcTwo(Exception):
    "exception two"


class test_myClass(unittest.TestCase):

    def setUp(self):

        self.myClass = myClass()

    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        #self.assertRaises(myExcTwo,self.myClass.getName)

        try:
            self.assertRaises(myExcTwo,self.myClass.getName)
        except Exception as e:
            pass

if __name__ == "__main__":

    #unittest.main()

    suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass)
    unittest.TextTestRunner(verbosity=2).run(suite)
4

2 回答 2

6

顺便说一句,语句中()的类名之后class在现代 Python 中是完全正确的——根本不是错误。

关于问题的实质,assertRaises(MyException, foo) 记录foo()了通过调用其类型不是子类的调用引发的异常MyException——它只捕获MyException及其子类。当您的代码引发一种类型的异常并且您的测试需要一种不同的不相关类型时,引发的异常将根据unittest模块的文档在此处传播,我引用:

如果引发异常,则测试通过,如果引发另一个异常则为错误,如果未引发异常,则测试失败。

而“是一个错误”的意思是“传播另一个异常”。

当您捕获在 try/except 块中传播的异常时,您会取消错误,并且没有什么unittest可诊断的了。如果您的目的是将此错误转变为失败(一个值得商榷的策略......),您的except块应该调用self.fail.

于 2009-08-05T01:40:11.017 回答
6

发布的代码是错误的。首先,class myClass():应该是class myClass:。还if name == "main":应该是:

if __name__ == "__main__":
    unittest.main()

除了这些问题之外,这失败了,因为getName()正在引发异常myExcOne并且您的测试需要异常myExcTwo

这是一些有效的代码。请编辑您问题中的代码,以便我们可以轻松地将其剪切并粘贴到 Python 会话中:

import unittest

class myExcOne(Exception): "exception one"

class myExcTwo(Exception): "exception two"

class myClass:
    def getName(self):
        raise myExcTwo

class test_myClass(unittest.TestCase):
    def setUp(self):
        self.myClass = myClass()
    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        self.assertRaises(myExcTwo,self.myClass.getName)

if __name__ == "__main__":
    unittest.main()
于 2009-08-05T00:05:41.880 回答