mirror of
https://github.com/python/cpython.git
synced 2025-11-24 20:30:18 +00:00
Issue #22903: The fake test case created by unittest.loader when it fails importing a test module is now picklable.
This commit is contained in:
commit
8eef6a9ad0
3 changed files with 37 additions and 10 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue