assertRaises失败,即使是callable引发了所需的异常(python,unittest)

时间:2012-09-20 16:27:34

标签: python unit-testing

我有以下测试代码检查函数中的异常引发。我希望测试通过,但是会指示失败。这是测试代码:

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()

在断言语句中调用other.func()时,会引发MyException(可以轻松检查)。因此,assertRaises测试应通过测试,因为other.func()MyException失败,但是:

....
MyException: 'ERROR: Just raised my exception!'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

我没有看到错误,所以我很感激对这个问题的一些意见。

1 个答案:

答案 0 :(得分:7)

由于语言的规则,在输入被调用函数的代码之前评估参数(这通常是一件好事)。因此,assertRaises无法捕获在评估参数期间发生的异常。解决方法(在多个API中)是您将可调用的传递给assertRaises等方法,因此他们可以在可以控制的位置对其进行评估,以及可以捕获异常的位置。如果整个参数是一个方法调用,那么绑定方法的魔力可以让你非常优雅地说明这一点,没有lambda或者这样的愚蠢:

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