Issue #9815: assertRaises now tries to clear references to local variables in the exception's traceback.
This commit is contained in:
parent
871dfc41d3
commit
9681022f1e
|
@ -9,6 +9,7 @@ import re
|
|||
import warnings
|
||||
import collections
|
||||
import contextlib
|
||||
import traceback
|
||||
|
||||
from . import result
|
||||
from .util import (strclass, safe_repr, _count_diff_all_purpose,
|
||||
|
@ -178,6 +179,8 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
|
|||
self.obj_name))
|
||||
else:
|
||||
self._raiseFailure("{} not raised".format(exc_name))
|
||||
else:
|
||||
traceback.clear_frames(tb)
|
||||
if not issubclass(exc_type, self.expected):
|
||||
# let unexpected exceptions pass through
|
||||
return False
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import datetime
|
||||
import warnings
|
||||
import weakref
|
||||
import unittest
|
||||
from itertools import product
|
||||
|
||||
|
@ -97,6 +98,36 @@ class Test_Assertions(unittest.TestCase):
|
|||
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:
|
||||
|
|
Loading…
Reference in New Issue