我有以下测试代码检查函数中的异常引发。我希望测试通过,但是会指示失败。这是测试代码:
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)
我没有看到错误,所以我很感激对这个问题的一些意见。
答案 0 :(得分:7)
由于语言的规则,在输入被调用函数的代码之前评估参数(这通常是一件好事)。因此,assertRaises
无法捕获在评估参数期间发生的异常。解决方法(在多个API中)是您将可调用的传递给assertRaises
等方法,因此他们可以在可以控制的位置对其进行评估,以及可以捕获异常的位置。如果整个参数是一个方法调用,那么绑定方法的魔力可以让你非常优雅地说明这一点,没有lambda
或者这样的愚蠢:
self.assertRaises(MyException, other.func) # <- note, no parentheses after func