Store the functions in the _type_equality_funcs as wrapped objects that are deep copyable.
This allows for the deep copying of TestCase instances.
Issue 5660
diff --git a/Lib/unittest.py b/Lib/unittest.py
index b6b96b3..3eedd56 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -160,7 +160,6 @@
raise _UnexpectedSuccess
return wrapper
-
__unittest = 1
class TestResult(object):
@@ -289,6 +288,16 @@
return True
+class _AssertWrapper(object):
+ """Wrap entries in the _type_equality_funcs registry to make them deep
+ copyable."""
+
+ def __init__(self, function):
+ self.function = function
+
+ def __deepcopy__(self, memo):
+ memo[id(self)] = self
+
class TestCase(object):
"""A class whose instances are single test cases.
@@ -361,7 +370,7 @@
msg= argument that raises self.failureException with a
useful error message when the two arguments are not equal.
"""
- self._type_equality_funcs[typeobj] = function
+ self._type_equality_funcs[typeobj] = _AssertWrapper(function)
def setUp(self):
"Hook method for setting up the test fixture before exercising it."
@@ -542,8 +551,10 @@
# See the discussion in http://bugs.python.org/issue2578.
#
if type(first) is type(second):
- return self._type_equality_funcs.get(type(first),
- self._baseAssertEqual)
+ asserter = self._type_equality_funcs.get(type(first))
+ if asserter is not None:
+ return asserter.function
+
return self._baseAssertEqual
def _baseAssertEqual(self, first, second, msg=None):