4

我在单元测试中使用 assertRaises 来测试特定异常的引发。

assertRaises(IOError, testToRun, passedValues)

虽然我需要捕获的一些异常具有特定的错误号 (errno),但我不想收集基本异常,而是想捕获与该异常相关的特定错误号。像这样的东西,虽然它显然不起作用:)

assertRaises(IOError.errno(2), testToRun, passedValue)

当我想捕获我一直在使用的特定编号的异常时,为了解决这个问题:-

try:
    testToRun(passedValues)
except IOError, e:
    if e.errno == 2:
        pass
    else:
        raise

我确信它并不完美,但它可以工作,但想知道是否可以使用 assertRaises 来做同样的事情,这是一种更紧凑的方式。

谢谢。

4

2 回答 2

4

从 2.7 开始,可以assertRaises与上下文管理器一起使用:

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
于 2012-04-15T23:20:27.367 回答
-1

您还可以使用当前代码创建一个新的 TestCase 函数:

def assertRaisesErrNo(self, exc, errno, f, *args, **kwargs):
    try:
        self.assertRaises(exc, f, *args, **kwargs)
    except IOError, e:
        if e.errno == errno:
            pass
        else:
            raise

unittest.TestCase.assertRaisesErrNo = assertRaisesErrNo

然后像任何其他assert方法一样使用它:

class TestSomething(unittest.TestCase):
    def test_somthing(self):
        self.assertRaisesErrNo(IOError, 2, myfunction)

您还可以使用contextlib.contextmanager轻松地将其转换为上下文管理器

于 2012-04-16T06:31:12.170 回答