我想捕获代码产生的 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/