mirror of https://github.com/python/cpython
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
This commit is contained in:
parent
7152f6d915
commit
e2942d073d
|
@ -11,6 +11,7 @@ from test import test_support
|
|||
import unittest
|
||||
from unittest import TestCase
|
||||
import types
|
||||
from copy import deepcopy
|
||||
|
||||
### Support code
|
||||
################################################################
|
||||
|
@ -2688,6 +2689,17 @@ test case
|
|||
self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam')
|
||||
self.failIf(False)
|
||||
|
||||
def testDeepcopy(self):
|
||||
# Issue: 5660
|
||||
class TestableTest(TestCase):
|
||||
def testNothing(self):
|
||||
pass
|
||||
|
||||
test = TestableTest('testNothing')
|
||||
|
||||
# This shouldn't blow up
|
||||
deepcopy(test)
|
||||
|
||||
|
||||
class Test_TestSkipping(TestCase):
|
||||
|
||||
|
|
|
@ -160,7 +160,6 @@ def expectedFailure(func):
|
|||
raise _UnexpectedSuccess
|
||||
return wrapper
|
||||
|
||||
|
||||
__unittest = 1
|
||||
|
||||
class TestResult(object):
|
||||
|
@ -289,6 +288,16 @@ class _AssertRaisesContext(object):
|
|||
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 @@ class TestCase(object):
|
|||
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 @@ class TestCase(object):
|
|||
# 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):
|
||||
|
|
Loading…
Reference in New Issue