diff options
author | Michael Foord <fuzzyman@voidspace.org.uk> | 2010-11-20 15:34:26 +0000 |
---|---|---|
committer | Michael Foord <fuzzyman@voidspace.org.uk> | 2010-11-20 15:34:26 +0000 |
commit | 9a11d45ee217e8606b8d1396e94d99e4f19c4f6d (patch) | |
tree | 8e239b69b29b24e66082f8c73d613e8512975e0d | |
parent | 04eb7638477a881764c08a60e7fce7c04a99639f (diff) | |
download | cpython-9a11d45ee217e8606b8d1396e94d99e4f19c4f6d.tar.gz |
Issue 10326: TestCase instances can now be pickled (they store names of instance methods instead of references to the instance methods themselves).
-rw-r--r-- | Lib/unittest/case.py | 35 | ||||
-rw-r--r-- | Lib/unittest/test/test_case.py | 12 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 42 insertions, 7 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 5831a76e03..1df19dca59 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -191,6 +191,27 @@ class _AssertWarnsContext(_AssertRaisesBaseContext): .format(exc_name)) +class _TypeEqualityDict(object): + + def __init__(self, testcase): + self.testcase = testcase + self._store = {} + + def __setitem__(self, key, value): + self._store[key] = value + + def __getitem__(self, key): + value = self._store[key] + if isinstance(value, str): + return getattr(self.testcase, value) + return value + + def get(self, key, default=None): + if key in self._store: + return self[key] + return default + + class TestCase(object): """A class whose instances are single test cases. @@ -253,13 +274,13 @@ class TestCase(object): # Map types to custom assertEqual functions that will compare # instances of said type in more detail to generate a more useful # error message. - self._type_equality_funcs = {} - self.addTypeEqualityFunc(dict, self.assertDictEqual) - self.addTypeEqualityFunc(list, self.assertListEqual) - self.addTypeEqualityFunc(tuple, self.assertTupleEqual) - self.addTypeEqualityFunc(set, self.assertSetEqual) - self.addTypeEqualityFunc(frozenset, self.assertSetEqual) - self.addTypeEqualityFunc(str, self.assertMultiLineEqual) + self._type_equality_funcs = _TypeEqualityDict(self) + self.addTypeEqualityFunc(dict, 'assertDictEqual') + self.addTypeEqualityFunc(list, 'assertListEqual') + self.addTypeEqualityFunc(tuple, 'assertTupleEqual') + self.addTypeEqualityFunc(set, 'assertSetEqual') + self.addTypeEqualityFunc(frozenset, 'assertSetEqual') + self.addTypeEqualityFunc(str, 'assertMultiLineEqual') def addTypeEqualityFunc(self, typeobj, function): """Add a type specific assertEqual style function to compare a type. diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 1bd839f27e..444b58be06 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -1,5 +1,6 @@ import difflib import pprint +import pickle import re import sys import warnings @@ -1095,3 +1096,14 @@ test case # This shouldn't blow up deepcopy(test) + + def testPickle(self): + # Issue 10326 + + # Can't use TestCase classes defined in Test class as + # pickle does not work with inner classes + test = unittest.TestCase('run') + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + + # blew up prior to fix + pickled_test = pickle.dumps(test, protocol=protocol) @@ -21,6 +21,8 @@ Core and Builtins Library ------- +- Issue 10326: unittest.TestCase instances can be pickled. + - Issue #9920: Skip tests for cmath.atan and cmath.atanh applied to complex zeros on systems where the log1p function fails to respect the sign of zero. This fixes a test failure on AIX. |