【问题标题】:assertRaises in unittest not catching Exception properly单元测试中的 assertRaises 未正确捕获异常
【发布时间】:2017-01-19 18:29:40
【问题描述】:

我有一个包含代码的文件 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 相同的行为

【问题讨论】:

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


【解决方案1】:

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

希望这有助于调试时访问此页面的任何人。

【讨论】:

  • 我自己也犯了一个非常相似的错误
【解决方案2】:

试试

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

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

【讨论】:

  • 你的答案也可以,但我只是想知道为什么它没有按照我想要的方式工作......看看@alexce的答案
  • 是的,那更好——我们同时发布了 :)
【解决方案3】:

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

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

【讨论】:

  • facepalm 时刻......谢谢@alexce 我知道它必须是简单的,但我无法确定它......因为我已经这样做了好几次并且它有效
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
相关资源
最近更新 更多