I want to catch a TypeError produced by the code, but unfortunately, unittest fails:
Here is the code:
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__":
Here is the error:
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)
Unquote the TypeError
and don't call Foo
directly, but pass the function (class Foo
) and arguments.
def test_bar_as_string(self):
self.assertRaises(TypeError, Foo, "a")
Or, you can use assertRaises
as context manager:
def test_bar_as_string(self):
with self.assertRaises(TypeError):
Foo("a")
You could do it as:
with self.assertRaises(TypeError):
Foo("a")
or
self.assertRaises(TypeError, Foo, "a")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With