]> granicus.if.org Git - python/commitdiff
Merged revisions 74556 via svnmerge from
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Fri, 13 Nov 2009 16:10:13 +0000 (16:10 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Fri, 13 Nov 2009 16:10:13 +0000 (16:10 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  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
Lib/test/test_unittest.py
Lib/unittest/case.py

index 984ec272dadcce27e383a75f509f6cb463fdeceb..c6a64053db9490e6e867e39ab7ff9546ca7d3b75 100644 (file)
@@ -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, ...])
 
index 9cdca96f62fdc1c31a92fc7c58f7593b34532258..e33f31e7e4f17f4850bc8fe485b5443468f8d4d9 100644 (file)
@@ -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.
 
index 79c4a7255b1d13b9952508a6abf746366532dd7c..ed17b6e5e2aad3ac34727df67c278cef989d2bcb 100644 (file)
@@ -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