python - unittest 中的 assertRaises 没有正确捕获异常

标签 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 运行它,lambda 是一个稍后将由 assertRaises 评估的可调用对象,它会按预期工作并且我明白了

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

OK

我正在运行 python 3.5

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

但我在 python2.7

上也有同样的行为

最佳答案

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

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

关于python - unittest 中的 assertRaises 没有正确捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39448269/

相关文章:

Python re question - 子挑战

java - 套接字在将 json 对象从 Java 传输到 Python 时被阻塞

ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息?

使用 Jasmine 进行 Angular 单元测试 - 错误 : Please add an @NgModule annotation

unit-testing - 圈复杂度和基本路径

python - 使用 Matplotlib 在 Python 中为 Langdon 的 Ant 制作动画

对具有无界通配符类型的方法参数使用泛型 lambda 的 Java 编译错误

c++ - 如何处理可选参数的模板类型名?

c++ - 回调 lambda 到 std::function 0xCCCCCCCC

python - django 1.11 中找不到静态文件