4

我有这样的代码:

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(""), (""))
4

1 回答 1

4

原因是raise检查参数的类型。它必须是一个字符串(又名“旧式例外”)或派生自BaseException

由于模拟也不是,raise因此拒绝使用它。

在这种特定情况下,您要么必须引发异常,要么使用猴子补丁(= 覆盖globals.myException测试中的符号并在之后恢复它)。

于 2013-02-08T11:18:34.897 回答