我想编写一个测试,以确定在给定的情况下不会引发异常。
测试是否引发异常是很简单的…
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... 但你怎么能反其道而行之呢。
像这样的东西是我所追求的…
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
我发现monkey-patch unittest很有用,如下所示:
def assertMayRaise(self, exception, expr):
if exception is None:
try:
expr()
except:
info = sys.exc_info()
self.fail('%s raised' % repr(info[0]))
else:
self.assertRaises(exception, expr)
unittest.TestCase.assertMayRaise = assertMayRaise
这在测试异常是否存在时阐明了意图:
self.assertMayRaise(None, does_not_raise)
这也简化了循环测试,我经常这样做:
# ValueError is raised only for op(x,x), op(y,y) and op(z,z).
for i,(a,b) in enumerate(itertools.product([x,y,z], [x,y,z])):
self.assertMayRaise(None if i%4 else ValueError, lambda: op(a, b))
def _assertNotRaises(self, exception, obj, attr):
try:
result = getattr(obj, attr)
if hasattr(result, '__call__'):
result()
except Exception as e:
if isinstance(e, exception):
raise AssertionError('{}.{} raises {}.'.format(obj, attr, exception))
如果需要接受参数,可以修改。
叫喜欢
self._assertNotRaises(IndexError, array, 'sort')