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
您应该将参数作为单独的参数单独传递给可调用对象:
self.assertRaises(TypeError, add, 1, '1', msg="Additon failed")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5867 次 |
| 最近记录: |