2015-08-08 26 views
3

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

我在寻找类似:

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

“same”的定义是什么?你的意思是同一类型吗? – mgilson

回答

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

首先调用第一功能和捕捉它会引发什么异常:

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

然后断言其他函数引发相同的异常:

self.assertRaises(e, outerfunction, arg) 
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)。将这个扩展到允许传递参数和** kwargs并不难。

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

相关问题