如何在不知道错误的情况下断言两个函数抛出相同的错误?

时间:2015-08-08 18:13:07

标签: python unit-testing

我有一个外部函数,通过传递参数来调用内部函数。是否可以测试两个函数在不知道确切错误类型的情况下抛出相同的异常/错误?

我正在寻找类似的东西:

def test_invalidInput_throwsSameError(self):
    arg = 'invalidarg'
    self.assertRaisesSameError(
        innerFunction(arg),
        outerFunction(arg)
    )

3 个答案:

答案 0 :(得分:7)

假设你正在使用unittest(以及python2.7或更新版本)并且你没有像将错误引发旧式类实例那样做一些病态的事情,你可以从错误上下文中获取异常您使用assertRaises作为上下文管理器。

with self.assertRaises(Exception) as err_context1:
    innerFunction(arg)

with self.assertRaises(Exception) as err_context2:
    outerFunction(arg)

# Or some other measure of "sameness"
self.assertEqual(
    type(err_context1.exception),
    type(err_context2.exception))

答案 1 :(得分:1)

首先调用第一个函数并捕获它引发的异常:

try:
    innerfunction(arg)
except Exception as e:
    pass
else:
    e = None

然后断言另一个函数引发相同的异常:

 self.assertRaises(e, outerfunction, arg)

答案 2 :(得分:0)

我相信这会做你想要的;只需将其添加为TestCase类的另一种方法:

def assertRaisesSameError(self, *funcs, bases=(Exception,)):
    exceptions = []

    for func in funcs:
        with self.assertRaises(base) as error_context:
            func()
            exceptions.append(error_context.exception)

    for exc in exceptions:
        self.assertEqual(type(exc), type(exc[-1]))

我没有对此进行测试,但它应该可行。为简单起见,这只涉及没有参数的函数,所以如果你的函数确实有参数,你必须创建一个包装器(即使只是一个lambda)。将此扩展为允许传入* args和** kwargs并不难。

让我知道任何人认为应该做出的任何改变。