From 92a653af95524525abf0bc6f5f08fa08dc714ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Fri, 13 Nov 2009 16:10:13 +0000 Subject: Merged revisions 74556 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ r74556 | kristjan.jonsson | 2009-08-27 22:20:21 +0000 (fim., 27 ßg·. 2009) | 2 lines issue 6275 Add an "exc_value" attribute to the _AssertRaisesContext context manager in the unittest package. This allows further tests on the exception that was raised after the context manager exits. ........ --- Doc/library/unittest.rst | 7 +++++++ Lib/test/test_unittest.py | 15 +++++++++++++++ Lib/unittest/case.py | 3 +++ 3 files changed, 25 insertions(+) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 984ec27..c6a6405 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -891,12 +891,19 @@ Test cases with self.failUnlessRaises(some_error_class): do_something() + The context manager will store the caught exception object in its + :attr:`exc_value` attribute. This can be useful if the intention + is to perform additional checks on the exception raised. + .. versionchanged:: 3.1 Added the ability to use :meth:`assertRaises` as a context manager. .. deprecated:: 3.1 :meth:`failUnlessRaises`. + .. versionchanged:: 3.1 + Added the :attr:`exc_value` attribute. + .. method:: assertRaisesRegexp(exception, regexp[, callable, ...]) diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 9cdca96..e33f31e 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -2847,6 +2847,21 @@ test case self.assertRaisesRegexp, Exception, re.compile('^Expected$'), Stub) + def testAssertRaisesExcValue(self): + class ExceptionMock(Exception): + pass + + def Stub(foo): + raise ExceptionMock(foo) + v = "particular value" + + ctx = self.assertRaises(ExceptionMock) + with ctx: + Stub(v) + e = ctx.exc_value + self.assertTrue(isinstance(e, ExceptionMock)) + self.assertEqual(e.args[0], v) + def testSynonymAssertMethodNames(self): """Test undocumented method name synonyms. diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 79c4a72..ed17b6e 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -116,6 +116,9 @@ class _AssertRaisesContext(object): if not issubclass(exc_type, self.expected): # let unexpected exceptions pass through return False + #store exception, without traceback, for later retrieval + self.exc_value = exc_value + self.exc_value.with_traceback(None) if self.expected_regex is None: return True -- cgit v0.12