在单元测试中使用errno和assertRaises

时间:2012-04-15 23:17:52

标签: python unit-testing

我在单元测试中使用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做同样的事情是一种更紧凑的方式。

感谢。

2 个答案:

答案 0 :(得分:4)

自2.7以来,可以将assertRaises与上下文管理器一起使用:

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

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)

答案 1 :(得分:-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

轻松将其转换为上下文管理器