我有一个文件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(我在代码中将其注释掉)来使我的测试正确捕获异常来解决它,但是根据文档,将一个callable和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相同的行为

最佳答案

您应该将参数分别作为单独的参数传递给callable:

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

10-06 02:03