summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-05-06 16:10:40 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-05-06 16:10:40 (GMT)
commit7f71e04cb510c24be337a22350324dc8a28e9775 (patch)
treedbeb710a30e361a92f2eeec75de79491c7f8983f
parent3234abb9a057beb88faeef96745f8c78772a88c2 (diff)
downloadcpython-7f71e04cb510c24be337a22350324dc8a28e9775.zip
cpython-7f71e04cb510c24be337a22350324dc8a28e9775.tar.gz
cpython-7f71e04cb510c24be337a22350324dc8a28e9775.tar.bz2
Issue #24134: assertRaises() and assertRaisesRegexp() checks are not longer
successful if the callable is None. Added tests for assertRaises().
-rw-r--r--Lib/unittest/case.py12
-rw-r--r--Lib/unittest/test/test_case.py46
-rw-r--r--Misc/NEWS3
3 files changed, 56 insertions, 5 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index 644fe5b..cef0567 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -127,6 +127,8 @@ class _AssertRaisesContext(object):
(expected_regexp.pattern, str(exc_value)))
return True
+def _sentinel(*args, **kwargs):
+ raise AssertionError('Should never called')
class TestCase(object):
"""A class whose instances are single test cases.
@@ -443,7 +445,7 @@ class TestCase(object):
return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
- def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
+ def assertRaises(self, excClass, callableObj=_sentinel, *args, **kwargs):
"""Fail unless an exception of class excClass is raised
by callableObj when invoked with arguments args and keyword
arguments kwargs. If a different type of exception is
@@ -451,7 +453,7 @@ class TestCase(object):
deemed to have suffered an error, exactly as for an
unexpected exception.
- If called with callableObj omitted or None, will return a
+ If called with callableObj omitted, will return a
context object used like this::
with self.assertRaises(SomeException):
@@ -467,7 +469,7 @@ class TestCase(object):
self.assertEqual(the_exception.error_code, 3)
"""
context = _AssertRaisesContext(excClass, self)
- if callableObj is None:
+ if callableObj is _sentinel:
return context
with context:
callableObj(*args, **kwargs)
@@ -973,7 +975,7 @@ class TestCase(object):
self.fail(self._formatMessage(msg, standardMsg))
def assertRaisesRegexp(self, expected_exception, expected_regexp,
- callable_obj=None, *args, **kwargs):
+ callable_obj=_sentinel, *args, **kwargs):
"""Asserts that the message in a raised exception matches a regexp.
Args:
@@ -987,7 +989,7 @@ class TestCase(object):
if expected_regexp is not None:
expected_regexp = re.compile(expected_regexp)
context = _AssertRaisesContext(expected_exception, self, expected_regexp)
- if callable_obj is None:
+ if callable_obj is _sentinel:
return context
with context:
callable_obj(*args, **kwargs)
diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py
index 4ddf436..4c2d1f9 100644
--- a/Lib/unittest/test/test_case.py
+++ b/Lib/unittest/test/test_case.py
@@ -954,6 +954,50 @@ test case
self.assertRaises(self.failureException, self.assertRegexpMatches,
'saaas', r'aaaa')
+ def testAssertRaisesCallable(self):
+ class ExceptionMock(Exception):
+ pass
+ def Stub():
+ raise ExceptionMock('We expect')
+ self.assertRaises(ExceptionMock, Stub)
+ # A tuple of exception classes is accepted
+ self.assertRaises((ValueError, ExceptionMock), Stub)
+ # *args and **kwargs also work
+ self.assertRaises(ValueError, int, '19', base=8)
+ # Failure when no exception is raised
+ with self.assertRaises(self.failureException):
+ self.assertRaises(ExceptionMock, lambda: 0)
+ # Failure when the function is None
+ with self.assertRaises(TypeError):
+ self.assertRaises(ExceptionMock, None)
+ # Failure when another exception is raised
+ with self.assertRaises(ExceptionMock):
+ self.assertRaises(ValueError, Stub)
+
+ def testAssertRaisesContext(self):
+ class ExceptionMock(Exception):
+ pass
+ def Stub():
+ raise ExceptionMock('We expect')
+ with self.assertRaises(ExceptionMock):
+ Stub()
+ # A tuple of exception classes is accepted
+ with self.assertRaises((ValueError, ExceptionMock)) as cm:
+ Stub()
+ # The context manager exposes caught exception
+ self.assertIsInstance(cm.exception, ExceptionMock)
+ self.assertEqual(cm.exception.args[0], 'We expect')
+ # *args and **kwargs also work
+ with self.assertRaises(ValueError):
+ int('19', base=8)
+ # Failure when no exception is raised
+ with self.assertRaises(self.failureException):
+ with self.assertRaises(ExceptionMock):
+ pass
+ # Failure when another exception is raised
+ with self.assertRaises(ExceptionMock):
+ self.assertRaises(ValueError, Stub)
+
def testAssertRaisesRegexp(self):
class ExceptionMock(Exception):
pass
@@ -964,6 +1008,8 @@ test case
self.assertRaisesRegexp(ExceptionMock, re.compile('expect$'), Stub)
self.assertRaisesRegexp(ExceptionMock, 'expect$', Stub)
self.assertRaisesRegexp(ExceptionMock, u'expect$', Stub)
+ with self.assertRaises(TypeError):
+ self.assertRaisesRegexp(ExceptionMock, 'expect$', None)
def testAssertNotRaisesRegexp(self):
self.assertRaisesRegexp(
diff --git a/Misc/NEWS b/Misc/NEWS
index 99ed860..fe16b3c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,9 @@ Core and Builtins
Library
-------
+- Issue #24134: assertRaises() and assertRaisesRegexp() checks are not longer
+ successful if the callable is None.
+
- Issue #23008: Fixed resolving attributes with boolean value is False in pydoc.
- Issues #24099, #24100, and #24101: Fix free-after-use bug in heapq's siftup