如何在python中模拟异常调用?
我有这样一个代码:如何在python中模拟异常调用?,python,mocking,Python,Mocking,我有这样一个代码: def extract(data): if len(data) == 3: a = 3 else: component = data.split("-") if len(component) == 3: a,b,c = component else: raise globals.myException("data1", "Incorrect forma
def extract(data):
if len(data) == 3:
a = 3
else:
component = data.split("-")
if len(component) == 3:
a,b,c = component
else:
raise globals.myException("data1", "Incorrect format", data)
return a,b,c
这是一个简化的。我想模拟异常类globals.myException。我正在这样做:
def test_extract_data_throws_exception(self):
with patch('globals.myException') as mock:
mock.__init__("data1", "Incorrect format", "")
with self.assertRaises(myException):
self.assertEqual(extract(""), (""))
我总是会遇到这样的错误:“TypeError:异常必须是旧式类或从BaseException派生的,而不是MagicMock”
编辑:正如@Aaron Digulla所建议的,猴子修补是正确的解决方案。我发布解决方案以帮助他人
def test_extract_data_throws_exception(self):
#monkey patching
class ReplaceClass(myException):
def __init__(self, module, message, detail = u''):
pass
globals.myException = ReplaceClass
with self.assertRaises(myException:
self.assertEqual(extract(""), (""))
原因是
raise
检查参数的类型。它必须是字符串(也称为“旧式异常”)或派生自BaseException
由于mock也不是,因此,raise
拒绝使用它
在这种特定情况下,您必须引发异常或使用(=在测试中覆盖符号
globals.myException
,然后将其还原)。为什么要模拟异常?为什么不简单地抛出它并在测试中捕获它呢?MyException从Exception扩展而来,但添加了一些功能,如日志服务和其他东西。我知道我可以将我的异常作为测试的一部分,但我希望保持单元测试的干净。另外,这也是一个好奇的问题:)谢谢你的帮助。我已经发布了使用猴子补丁的解决方案。您需要在测试后恢复原始值!