Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单元测试中将errno与assertRaises一起使用_Python_Unit Testing - Fatal编程技术网

Python 在单元测试中将errno与assertRaises一起使用

Python 在单元测试中将errno与assertRaises一起使用,python,unit-testing,Python,Unit Testing,我在单元测试中使用assertRaises来测试特定异常的引发 assertRaises(IOError, testToRun, passedValues) 虽然我需要捕获的一些异常具有特定的错误号(errno),但是我不想收集基本异常,而是希望捕获与该异常相关的特定错误号。类似这样的东西,尽管它显然不起作用:) 当我想捕获我一直在使用的特定编号的异常时,要解决这个问题,请执行以下操作:- try: testToRun(passedValues) except IOError, e:

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

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

当我想捕获我一直在使用的特定编号的异常时,要解决这个问题,请执行以下操作:-

try:
    testToRun(passedValues)
except IOError, e:
    if e.errno == 2:
        pass
    else:
        raise
我确信它不是完美的,但它可以工作,但我想知道是否可以使用assertRaises以更紧凑的方式来做同样的事情


谢谢

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

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

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

您还可以使用当前代码创建新的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)

您还可以使用

轻松地将其转换为上下文管理器,谢谢您的回复。我不熟悉context manager,但会仔细阅读它。assertRaises调用不处理异常,所以您的特殊IOError代码永远不会运行吗?你测试过这个吗?
class TestSomething(unittest.TestCase):
    def test_somthing(self):
        self.assertRaisesErrNo(IOError, 2, myfunction)