Skip to content
Advertisement

Why does python unittest assertRaises method not register exceptions that are thrown?

I have a problem similar to this post, however the solution doesn’t help me as I only pass one argument to the function.

I have the following code:

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

which I test using the python unittest module. However, even when my exceptions are raised, the assertions fail.

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))

When I run this, the traceback is:

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

As you can see, it printed pass only integers in tuple so the exception was thrown.

The problem is the same if i switch places so the ValueError is tested first and fails.

Weirdly enough, if i change the assertions to:

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)))

It works for the TypeError, but not the ValueError.

Here is the traceback:

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)

Thankful for all guidance.

Advertisement

Answer

tuple_unpacker prints and then suppresses TypeError and ValueError exceptions. Your test checks for these exceptions but since the exceptions aren’t reraised, the test fails. Either the function or the test has a bug and needs to change.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement