diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2015-03-18 23:01:37 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2015-03-18 23:01:37 (GMT) |
commit | 8eef6a9ad04f6f81190f44ae3ded427e4083baa2 (patch) | |
tree | 1efe0d3c609b40de1725719968942f6780f7581f /Lib/unittest/loader.py | |
parent | 52a05ab52467ad1df7572f656cf87fc47aa0282d (diff) | |
parent | d833779ceaebeb29352488ffddabf5fc2f070364 (diff) | |
download | cpython-8eef6a9ad04f6f81190f44ae3ded427e4083baa2.zip cpython-8eef6a9ad04f6f81190f44ae3ded427e4083baa2.tar.gz cpython-8eef6a9ad04f6f81190f44ae3ded427e4083baa2.tar.bz2 |
Issue #22903: The fake test case created by unittest.loader when it fails importing a test module is now picklable.
Diffstat (limited to 'Lib/unittest/loader.py')
-rw-r--r-- | Lib/unittest/loader.py | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index 8ee6c56..8a1a2a7 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -20,23 +20,34 @@ __unittest = True VALID_MODULE_NAME = re.compile(r'[_a-z]\w*\.py$', re.IGNORECASE) +class _FailedTest(case.TestCase): + _testMethodName = None + + def __init__(self, method_name, exception): + self._exception = exception + super(_FailedTest, self).__init__(method_name) + + def __getattr__(self, name): + if name != self._testMethodName: + return super(_FailedTest, self).__getattr__(name) + def testFailure(): + raise self._exception + return testFailure + + def _make_failed_import_test(name, suiteClass): message = 'Failed to import test module: %s\n%s' % ( name, traceback.format_exc()) - return _make_failed_test('ModuleImportFailure', name, ImportError(message), - suiteClass, message) + return _make_failed_test(name, ImportError(message), suiteClass, message) def _make_failed_load_tests(name, exception, suiteClass): message = 'Failed to call load_tests:\n%s' % (traceback.format_exc(),) return _make_failed_test( - 'LoadTestsFailure', name, exception, suiteClass, message) + name, exception, suiteClass, message) -def _make_failed_test(classname, methodname, exception, suiteClass, message): - def testFailure(self): - raise exception - attrs = {methodname: testFailure} - TestClass = type(classname, (case.TestCase,), attrs) - return suiteClass((TestClass(methodname),)), message +def _make_failed_test(methodname, exception, suiteClass, message): + test = _FailedTest(methodname, exception) + return suiteClass((test,)), message def _make_skipped_test(methodname, exception, suiteClass): @case.skip(str(exception)) @@ -169,7 +180,7 @@ class TestLoader(object): else: # Otherwise, we signal that an AttributeError has occurred. error_case, error_message = _make_failed_test( - 'AttributeError', part, e, self.suiteClass, + part, e, self.suiteClass, 'Failed to access attribute:\n%s' % ( traceback.format_exc(),)) self.errors.append(error_message) |