【问题标题】:Using errno with assertRaises in Unit Test在单元测试中使用带有 assertRaises 的 errno
【发布时间】:2012-04-15 23:17:51
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: python unit-testing


    【解决方案1】:

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

    with self.assertRaises(SomeException) as cm:
        do_something()
    
    the_exception = cm.exception
    self.assertEqual(the_exception.error_code, 3)
    

    【讨论】:

    • 感谢您的回复。我不熟悉上下文管理器,但会阅读它。
    【解决方案2】:

    您还可以使用当前代码创建一个新的 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 轻松地将其转换为上下文管理器

    【讨论】:

    • assertRaises 调用不处理异常,所以您的特殊 IOError 代码永远不会运行吗?你测试过吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多