我想捕获代码产生的 TypeError,但不幸的是,unittest 失败了:

这是代码:

import unittest

class _Foo(object):
    def __init__(self):
        self.bar = ['AAA']

    def _validate_bar(self, bar):
        if not isinstance(bar, list):
            raise TypeError
        return True

class Foo(_Foo):
    def __init__(self, bar=None):
        super(Foo, self).__init__()
        if bar and self._validate_bar(bar):
            self.bar = bar

class FooTest(unittest.TestCase):

    def test_bar_as_string(self):
        self.assertRaises("TypeError", Foo("a"))

    #def test_a(self):
    #    try:
    #        Foo('a')
    #    except Exception as exc:
    #        self.assertEqual('TypeError', exc.__class__.__name__)

    #def test_bar_as_string(self):
    #    with self.assertRaises("TypeError"):
    #        Foo("a")

if __name__ == "__main__":

这是错误:
test_bar_as_string (__main__.FooTest) ... ERROR

======================================================================
ERROR: test_bar_as_string (__main__.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 21, in test_bar_as_string
    self.assertRaises("TypeError", Foo("a"))
  File "test.py", line 15, in __init__
    if bar and self._validate_bar(bar):
  File "test.py", line 9, in _validate_bar
    raise TypeError
TypeError

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

FAILED (errors=1)



    unittest.main(verbosity=2)

最佳答案

取消引用 TypeError 并且不要直接调用 Foo,而是传递函数(类 Foo )和参数。

def test_bar_as_string(self):
    self.assertRaises(TypeError, Foo, "a")

或者,您可以使用 assertRaises 作为上下文管理器:
def test_bar_as_string(self):
    with self.assertRaises(TypeError):
        Foo("a")

关于python - 如何使用 assertRaises() 捕获 "TypeError",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22843336/

10-13 09:06