【发布时间】:2016-02-28 10:04:13
【问题描述】:
我正在尝试创建一个单元测试来检查 Python 3.4 代码的错误处理。我正在使用 mock 中的 MagicMock 替换子函数并将异常作为副作用引发,然后使用 unittest 中的 assertRaises 来检查引发的异常。
不幸的是,尽管代码似乎正在处理异常,但测试似乎因为异常而崩溃。我尝试重写测试以使用 try/except 循环无效,并且尝试将其转换为nose2 @raise AttributeError 无济于事。
代码中的错误处理是否以某种方式阻止了测试捕获引发的异常?
代码:
import unittest2 as unittest
from mock import MagicMock
class Service():
def _execute(self, entity, destport):
print("setting format to json")
self.format = "json"
try:
print("call _reply_in_json")
getattr(self, "_reply_in_%s" % self.format)(entity, destport)
return ""
except AttributeError:
print("Invalid format requested")
err = "invalid format requested"
return err
class TestService(unittest.TestCase):
def test_executeAttributeError(self):
self.entity = "butter"
self.destport = 54
self.ret = False
print("## Starting test_executeAttributeError for CsvDs")
# Set up test objects
testDS = Service()
testDS._reply_in_json = MagicMock(name='_reply_in_json', side_effect=Exception(AttributeError))
# Run the test
with self.assertRaises(AttributeError):
print("Execute new request")
self.ret = testDS._execute(self.entity, self.destport)
if self.ret:
self.assertEqual(self.ret, "invalid format requested")
# Check the call was made correctly.
testDS._reply_in_json.assert_called_once_with(self.entity, self.destport)
else:
print("nothing returned")
print("test_executeAttributeError for CsvDs completed successfully\n")
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestService)
unittest.TextTestRunner(verbosity=2).run(suite)
输出:
## Starting test_executeAttributeError for CsvDs
Execute new request
setting format to json
call _reply_in_json
Error
Traceback (most recent call last):
File "daltest/test_test.py", line 37, in test_executeAttributeError
self.ret = testDS._execute(self.entity, self.destport)
File "daltest/test_test.py", line 13, in _execute
getattr(self, "_reply_in_%s" % self.format)(entity, destport)
File "/usr/lib/python3.4/site-packages/mock/mock.py", line 1062, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/usr/lib/python3.4/site-packages/mock/mock.py", line 1118, in _mock_call
raise effect
Exception: <class 'AttributeError'>
Process finished with exit code 0
【问题讨论】:
标签: python unit-testing exception mocking