首页 > 解决方案 > 为什么 python unittest assertRaises 方法不注册抛出的异常?

问题描述

我有一个与这篇文章类似的问题,但是该解决方案对我没有帮助,因为我只将一个参数传递给函数。

我有以下代码:

def outer():
    def tuple_unpacker( mytuple ):
        try:
            a,b,c = mytuple
            return a+b+c
        except ValueError:
            print('pass tuple with exactly 3 elements')
        except TypeError:
            print('pass only integers in tuple')

    return tuple_unpacker

我使用 python unittest 模块进行测试。但是,即使引发了我的异常,断言也会失败。

class TestInner(unittest.TestCase):
    def test_tuple_unpacker(self):
        func = outer()
        self.assertRaises(TypeError, func, (1,'a',1))
        self.assertRaises(ValueError, func, (1,1,1,1))

当我运行它时,回溯是:

pass only integers in tuple
F
======================================================================
FAIL: test_tuple_unpacker (__main__.TestInner)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/malte/TDDE23_git/lab5/test_test.py", line 21, in test_tuple_unpacker
    self.assertRaises(TypeError, func, (1,'a',1))
AssertionError: TypeError not raised by tuple_unpacker

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

如您所见,它打印出来了,pass only integers in tuple所以抛出了异常。

如果我切换位置,则问题是相同的,因此首先测试 ValueError 并失败。

奇怪的是,如果我将断言更改为:

class TestInner(unittest.TestCase):

    def test_tuple_unpacker(self):
        func = outer()
        self.assertRaises(TypeError, func((1,'a',1)))
        self.assertRaises(ValueError, func((1,1,1,1)))

它适用于 TypeError,但不适用于 ValueError。

这是回溯:

pass only integers in tuple
pass tuple with exactly 3 elements
E
======================================================================
ERROR: test_tuple_unpacker (__main__.TestInner)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/malte/TDDE23_git/lab5/test_test.py", line 22, in test_tuple_unpacker
    self.assertRaises(ValueError, func((1,1,1,1)))
  File "/usr/local/Cellar/python@3.9/3.9.7/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py", line 731, in assertRaises
    return context.handle('assertRaises', args, kwargs)
  File "/usr/local/Cellar/python@3.9/3.9.7/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py", line 201, in handle
    callable_obj(*args, **kwargs)
TypeError: 'NoneType' object is not callable

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

感谢大家的指导。

标签: pythonunit-testingpython-unittestassertvalueerror

解决方案


tuple_unpacker打印然后抑制TypeErrorValueError异常。您的测试会检查这些异常,但由于未重新引发异常,因此测试失败。函数或测试有错误,需要更改。


推荐阅读