Issue #9815: assertRaises now tries to clear references to local variables in the exception's traceback.
diff --git a/Lib/unittest/test/test_assertions.py b/Lib/unittest/test/test_assertions.py
index af08d5a..c349a95 100644
--- a/Lib/unittest/test/test_assertions.py
+++ b/Lib/unittest/test/test_assertions.py
@@ -1,5 +1,6 @@
import datetime
import warnings
+import weakref
import unittest
from itertools import product
@@ -97,6 +98,36 @@
else:
self.fail("assertRaises() didn't let exception pass through")
+ def test_assertRaises_frames_survival(self):
+ # Issue #9815: assertRaises should avoid keeping local variables
+ # in a traceback alive.
+ class A:
+ pass
+ wr = None
+
+ class Foo(unittest.TestCase):
+
+ def foo(self):
+ nonlocal wr
+ a = A()
+ wr = weakref.ref(a)
+ try:
+ raise IOError
+ except IOError:
+ raise ValueError
+
+ def test_functional(self):
+ self.assertRaises(ValueError, self.foo)
+
+ def test_with(self):
+ with self.assertRaises(ValueError):
+ self.foo()
+
+ Foo("test_functional").run()
+ self.assertIsNone(wr())
+ Foo("test_with").run()
+ self.assertIsNone(wr())
+
def testAssertNotRegex(self):
self.assertNotRegex('Ala ma kota', r'r+')
try: