From: Serhiy Storchaka Date: Wed, 6 May 2015 16:10:40 +0000 (+0300) Subject: Issue #24134: assertRaises() and assertRaisesRegexp() checks are not longer X-Git-Tag: v2.7.10rc1~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f71e04cb510c24be337a22350324dc8a28e9775;p=python Issue #24134: assertRaises() and assertRaisesRegexp() checks are not longer successful if the callable is None. Added tests for assertRaises(). --- diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 644fe5b5c5..cef05678f6 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 4ddf4362e0..4c2d1f99eb 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 99ed86025e..fe16b3c789 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