我有这样的代码:
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
拒绝使用它。
在这种特定情况下,您必须引发异常或使用 monkey patching (= 在您的测试中覆盖符号 globals.myException
并在之后恢复它)。
关于python - 如何在 python 中模拟异常调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771039/