How do you test that a Python function throws an exception?
Use TestCase.assertRaises
(or TestCase.failUnlessRaises
) from the unittest module, for example:
import mymodclass MyTestCase(unittest.TestCase): def test1(self): self.assertRaises(SomeCoolException, mymod.myfunc)
Since Python 2.7 you can use context manager to get ahold of the actual Exception object thrown:
import unittestdef broken_function(): raise Exception('This is broken')class MyTestCase(unittest.TestCase): def test(self): with self.assertRaises(Exception) as context: broken_function() self.assertTrue('This is broken' in context.exception)if __name__ == '__main__': unittest.main()
http://docs.python.org/dev/library/unittest.html#unittest.TestCase.assertRaises
In Python 3.5, you have to wrap context.exception
in str
, otherwise you'll get a TypeError
self.assertTrue('This is broken' in str(context.exception))
The code in my previous answer can be simplified to:
def test_afunction_throws_exception(self): self.assertRaises(ExpectedException, afunction)
And if afunction takes arguments, just pass them into assertRaises like this:
def test_afunction_throws_exception(self): self.assertRaises(ExpectedException, afunction, arg1, arg2)