[Python-checkins] r71043 - in python/trunk/Lib: test/test_unittest.py unittest.py

michael.foord python-checkins at python.org
Thu Apr 2 07:51:54 CEST 2009


Author: michael.foord
Date: Thu Apr 2 07:51:54 2009
New Revision: 71043
Log:
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
Modified:
 python/trunk/Lib/test/test_unittest.py
 python/trunk/Lib/unittest.py
Modified: python/trunk/Lib/test/test_unittest.py
==============================================================================
--- python/trunk/Lib/test/test_unittest.py	(original)
+++ python/trunk/Lib/test/test_unittest.py	Thu Apr 2 07:51:54 2009
@@ -11,6 +11,7 @@
 import unittest
 from unittest import TestCase
 import types
+from copy import deepcopy
 
 ### Support code
 ################################################################
@@ -2688,6 +2689,17 @@
 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):
 
Modified: python/trunk/Lib/unittest.py
==============================================================================
--- python/trunk/Lib/unittest.py	(original)
+++ python/trunk/Lib/unittest.py	Thu Apr 2 07:51:54 2009
@@ -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):


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /