assertRaises在unittest中没有正确捕获异常

时间:2016-09-12 10:28:42

标签: python unit-testing lambda python-3.5 python-unittest

我有一个文件testtest.py,其中包含代码

import unittest

def add(self, a, b):
    return a + b

class Test(unittest.TestCase):

    def test_additon(self):
        self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
        #self.assertRaises(TypeError, lambda: add(1 + '1'), msg="Addition failed")

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

问题是assertRaises没有正确捕获异常并且我的所有测试都因为错误而不是基于条件而失败,这是我得到的输出:

E
======================================================================
ERROR: test_additon (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "testtest.py", line 9, in test_additon
    self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
TypeError: unsupported operand type(s) for +: 'int' and 'str'

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

我知道我可以通过使用lambda来解决它(我在代码中注释掉它)以使我的测试正确捕获异常,但是根据文档,将可调用和参数传递给assertRaises应该工作,因为它将自己内部调用函数,并能够捕获任何引发的异常。

assertRaises(*callable*, *args*, *kwargs*)

但它没有

如果我使用lambda运行它,它是一个可调用的,稍后将由assertRaises进行评估,它可以正常工作,我得到了这个

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

I'm running python 3.5

Python 3.5.2 (default, Jun 28 2016, 08:46:01) 
[GCC 6.1.1 20160602] on linux

但我也与python2.7

有相同的行为

3 个答案:

答案 0 :(得分:4)

您应该将参数传递给可调用的单独,作为单独的参数:

self.assertRaises(TypeError, add, 1, '1', msg="Additon failed")

答案 1 :(得分:2)

就我而言,我犯了一个愚蠢的错误,我调用了被测试的函数两次,而 assertRaises() 是在第二次调用该函数时。
因此,Exception 在第一个调用中被引发,甚至在第二个调用执行之前!

希望这可以帮助任何人在调试时点击此页面。

答案 2 :(得分:1)

尝试

def test_additon(self):
    with self.assertRaises(TypeError):
        add(1 + '1')

问题是在self.assertRaises可以启动之前,在参数评估期间会引发异常。