单元测试中的 assertRaises 没有正确捕获异常

dan*_*dee 6 python lambda unit-testing python-unittest python-3.5

我有一个包含代码的文件 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()
Run Code Online (Sandbox Code Playgroud)

问题是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)
Run Code Online (Sandbox Code Playgroud)

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

assertRaises(*callable*, *args*, *kwargs*)
Run Code Online (Sandbox Code Playgroud)

但它没有

如果我用 lambda 运行它,它是一个可调用的,稍后会被评估assertRaises,它会按预期工作,我得到这个

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

OK
Run Code Online (Sandbox Code Playgroud)

I'm running python 3.5

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

但我也有同样的行为 python2.7

ale*_*cxe 4

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

self.assertRaises(TypeError, add, 1, '1', msg="Additon failed")
Run Code Online (Sandbox Code Playgroud)