mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Merged revisions 67979 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r67979 | antoine.pitrou | 2008-12-28 15:09:36 +0100 (dim., 28 déc. 2008) | 3 lines Issue #4444: Allow assertRaises() to be used as a context handler. ........
This commit is contained in:
parent
ccc47b6eee
commit
5acd41e0a1
4 changed files with 88 additions and 11 deletions
|
@ -149,6 +149,36 @@ class TestResult:
|
|||
(_strclass(self.__class__), self.testsRun, len(self.errors),
|
||||
len(self.failures))
|
||||
|
||||
class AssertRaisesContext:
|
||||
def __init__(self, expected, test_case, callable_obj=None):
|
||||
self.expected = expected
|
||||
self.failureException = test_case.failureException
|
||||
if callable_obj is not None:
|
||||
try:
|
||||
self.obj_name = callable_obj.__name__
|
||||
except AttributeError:
|
||||
self.obj_name = str(callable_obj)
|
||||
else:
|
||||
self.obj_name = None
|
||||
def __enter__(self):
|
||||
pass
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
if exc_type is None:
|
||||
try:
|
||||
exc_name = self.expected.__name__
|
||||
except AttributeError:
|
||||
exc_name = str(self.expected)
|
||||
if self.obj_name:
|
||||
raise self.failureException("{0} not raised by {1}"
|
||||
.format(exc_name, self.obj_name))
|
||||
else:
|
||||
raise self.failureException("{0} not raised"
|
||||
.format(exc_name))
|
||||
if issubclass(exc_type, self.expected):
|
||||
return True
|
||||
# Let unexpected exceptions skip through
|
||||
return False
|
||||
|
||||
class TestCase:
|
||||
"""A class whose instances are single test cases.
|
||||
|
||||
|
@ -299,23 +329,25 @@ class TestCase:
|
|||
"""Fail the test unless the expression is true."""
|
||||
if not expr: raise self.failureException(msg)
|
||||
|
||||
def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
|
||||
def failUnlessRaises(self, excClass, callableObj=None, *args, **kwargs):
|
||||
"""Fail unless an exception of class excClass is thrown
|
||||
by callableObj when invoked with arguments args and keyword
|
||||
arguments kwargs. If a different type of exception is
|
||||
thrown, it will not be caught, and the test case will be
|
||||
deemed to have suffered an error, exactly as for an
|
||||
unexpected exception.
|
||||
|
||||
If called with callableObj omitted or None, will return a
|
||||
context object used like this::
|
||||
|
||||
with self.failUnlessRaises(some_error_class):
|
||||
do_something()
|
||||
"""
|
||||
try:
|
||||
context = AssertRaisesContext(excClass, self, callableObj)
|
||||
if callableObj is None:
|
||||
return context
|
||||
with context:
|
||||
callableObj(*args, **kwargs)
|
||||
except excClass:
|
||||
return
|
||||
else:
|
||||
excName = str(getattr(excClass, '__name__', excClass))
|
||||
objName = str(getattr(callableObj, '__name__', callableObj))
|
||||
raise self.failureException("%s not raised by %s" % (excName,
|
||||
objName))
|
||||
|
||||
def failUnlessEqual(self, first, second, msg=None):
|
||||
"""Fail if the two objects are unequal as determined by the '=='
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue