python - 如何在 python 中模拟异常调用?

标签 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 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/

相关文章:

python - 如何将两个不同长度的列表合并为 Pandas 数据框?

python - 将 .format 与字符串字典结合使用

基于 Python 的网络报告工具?

unit-testing - 模拟命名导出以使用 Jest 进行测试

apache-spark - Mockito 验证不使用序列化/反序列化模拟

Python:在 Windows 或 Linux 上获取挂载点

python - 编写一个函数来结束程序?

android - 模拟ormlite数据库

javascript - 在客户端模拟 HTTP 请求

c++ - 避免模​​拟 std::fstream 类的 "inheritance by dominance"警告