diff options
author | Michael Foord <fuzzyman@voidspace.org.uk> | 2009-04-02 05:51:54 (GMT) |
---|---|---|
committer | Michael Foord <fuzzyman@voidspace.org.uk> | 2009-04-02 05:51:54 (GMT) |
commit | e2942d073d4b8a1f9b5f48c73855f409e6b900b2 (patch) | |
tree | 1649336e68d7b466e35528c8e191d40e6e3d7cd2 /Lib | |
parent | 7152f6d9156a19a9f1b31e313d2c19d840dc089d (diff) | |
download | cpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.zip cpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.tar.gz cpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.tar.bz2 |
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
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_unittest.py | 12 | ||||
-rw-r--r-- | Lib/unittest.py | 19 |
2 files changed, 27 insertions, 4 deletions
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index c16327e..38c4f8f 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -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): 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 @@ 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): |