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