assertRaises失败,即使是callable也会引发所需的异常(python,unitest)

2024-10-03 21:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的测试代码检查函数中是否出现异常。我希望考试能通过,但结果却表明考试失败了。测试代码如下:

import unittest

# define a user-defined exception
class MyException(Exception):
    def __str__(self):
        return repr("ERROR: Just raised my exception!")

# this is my main class with a method raising this exception
class MyMainObject(object):

    def func(self):
        raise MyException()

# the test class
class TestConfig(unittest.TestCase):

    def test_1(self):

        other = MyMainObject()
        self.assertRaises(MyException, other.func())

# calling the test
if __name__ == '__main__':    
    unittest.main()

当在assert语句中调用other.func()时,MyException将被引发(可以很容易地检查)。因此,assertRaises测试应该通过测试,因为other.func()与{}一起失败,但是:

^{pr2}$

我看不出什么问题,所以我希望能在这个问题上提供一些意见。在


Tags: thetestselfmainmydefexceptionunittest
2条回答

assertRaises为您调用函数。通过自己调用它,在assertRaises可以测试它之前引发了。在

将代码更改为:

self.assertRaises(MyException, other.func)

它会正常工作的。或者,您可以使用assertRaises作为上下文管理器(Python2.7及更高版本):

^{pr2}$

使用assertRaises作为上下文管理器有一个额外的优势,您现在可以检索异常实例并对其执行进一步的测试:

with self.assertRaises(MyException) as raises_cm:
    other.func()

exception = raises_cm.exception
self.assertEqual(exception.args, ('foo', 'bar'))

由于语言的规则,在输入被调用函数的代码之前对参数进行求值(这通常是件好事)。因此,assertRaises无法捕捉参数求值期间发生的异常。解决方法(在多个API中)是将一个可调用的传递给像assertRaises这样的方法,这样它们就可以在它们可以控制的位置和捕捉异常的地方对其进行求值。如果整个参数是一个方法调用,那么绑定方法的魔力使您可以非常优雅地声明这一点,而不必使用lambda或这样的愚蠢:

self.assertRaises(MyException, other.func) # <- note, no parentheses after func

相关问题 更多 >