Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中模拟异常调用?_Python_Mocking - Fatal编程技术网

如何在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扩展而来,但添加了一些功能,如日志服务和其他东西。我知道我可以将我的异常作为测试的一部分,但我希望保持单元测试的干净。另外,这也是一个好奇的问题:)谢谢你的帮助。我已经发布了使用猴子补丁的解决方案。您需要在测试后恢复原始值!