I am testing an exception using assertRaises, even though exception is raised, it is not detected by assertRaises
Here is the method under test:
def process_data(data):
"""
process output data
:return: dict object
"""
component = dict()
try:
properties = dict()
properties['state'] = data['state']
properties['status'] = data['status']
component['properties'] = properties
except KeyError as e:
print "Missing key '{0}' in the response data".format(str(e))
return component
sample_data = {}
process_data(sample_data)
And the test code is:
import unittest
import test_exception
class TestExceptions(unittest.TestCase):
"""
test class
"""
def test_process_data(self):
"""
test
:return:
"""
sample = {}
self.assertRaises(KeyError, test_exception.process_data, sample)
if __name__ == '__main__':
unittest.main()
But it is not working as expected, getting following errors:
unittest -p test_test_exception.py
Missing key ''state'' in the response data
Missing key ''state'' in the response data
Failure
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 331, in run
testMethod()
File "/unittest/test_test_exception.py", line 16, in test_process_data
self.assertRaises(KeyError, test_exception.process_data, sample)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 475, in assertRaises
callableObj(*args, **kwargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 116, in __exit__
"{0} not raised".format(exc_name))
AssertionError: KeyError not raised
Ran 1 test in 0.001s
FAILED (failures=1)
Process finished with exit code 1
What is wrong with unit test case?
Thank you for posting a clear question with the proper context and code. Here's the problem:
except KeyError as e:
print "Missing key '{0}' in the response data".format(str(e))
This should be:
except KeyError as e:
print "Missing key '{0}' in the response data".format(str(e))
raise
Your Unit Test is checking that the Exception is RAISED (where the code is short circuited completely). Finding the exception type and printing the message is not the same as raising the error with the raise
keyword.