From 5a9719d62745a8eed14b5084c2bdb16bf5cb8011 Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Sun, 13 Sep 2009 17:28:35 +0000 Subject: [PATCH] unittest.TestLoader.loadTestsFromName honors the loader suiteClass attribute. Issue 6866. --- Doc/whatsnew/2.7.rst | 3 +++ Lib/test/test_unittest.py | 41 +++++++++++++++++++++++++++++++++++++++ Lib/unittest/loader.py | 4 ++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 6089d33f544..622da3e391f 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -509,6 +509,9 @@ changes, or look through the Subversion logs for all the details. (automatically pass or fail without checking decimal places) if the objects are equal. + * :meth:`loadTestsFromName` properly honors the ``suiteClass`` attribute of + the :class:`TestLoader`. (Fixed by Mark Roddy; :issue:`6866`.) + * A new hook, :meth:`addTypeEqualityFunc` takes a type object and a function. The :meth:`assertEqual` method will use the function when both of the objects being compared are of the specified type. diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 2fab7de9796..79ee9827ec8 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -554,6 +554,47 @@ class Test_TestLoader(TestCase): self.assertTrue(isinstance(suite, loader.suiteClass)) self.assertEqual(list(suite), [testcase_1]) + # "The specifier name is a ``dotted name'' that may resolve ... to + # ... a callable object which returns a TestCase ... instance" + #***************************************************************** + #Override the suiteClass attribute to ensure that the suiteClass + #attribute is used + def test_loadTestsFromName__callable__TestCase_instance_ProperSuiteClass(self): + class SubTestSuite(unittest.TestSuite): + pass + m = types.ModuleType('m') + testcase_1 = unittest.FunctionTestCase(lambda: None) + def return_TestCase(): + return testcase_1 + m.return_TestCase = return_TestCase + + loader = unittest.TestLoader() + loader.suiteClass = SubTestSuite + suite = loader.loadTestsFromName('return_TestCase', m) + self.assertTrue(isinstance(suite, loader.suiteClass)) + self.assertEqual(list(suite), [testcase_1]) + + # "The specifier name is a ``dotted name'' that may resolve ... to + # ... a test method within a test case class" + #***************************************************************** + #Override the suiteClass attribute to ensure that the suiteClass + #attribute is used + def test_loadTestsFromName__relative_testmethod_ProperSuiteClass(self): + class SubTestSuite(unittest.TestSuite): + pass + m = types.ModuleType('m') + class MyTestCase(unittest.TestCase): + def test(self): + pass + m.testcase_1 = MyTestCase + + loader = unittest.TestLoader() + loader.suiteClass=SubTestSuite + suite = loader.loadTestsFromName('testcase_1.test', m) + self.assertTrue(isinstance(suite, loader.suiteClass)) + + self.assertEqual(list(suite), [MyTestCase('test')]) + # "The specifier name is a ``dotted name'' that may resolve ... to # ... a callable object which returns a TestCase or TestSuite instance" # diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index 21c7ed02b19..21520f522e8 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -85,7 +85,7 @@ class TestLoader(object): elif (isinstance(obj, types.UnboundMethodType) and isinstance(parent, type) and issubclass(parent, case.TestCase)): - return suite.TestSuite([parent(obj.__name__)]) + return self.suiteClass([parent(obj.__name__)]) elif isinstance(obj, suite.TestSuite): return obj elif hasattr(obj, '__call__'): @@ -93,7 +93,7 @@ class TestLoader(object): if isinstance(test, suite.TestSuite): return test elif isinstance(test, case.TestCase): - return suite.TestSuite([test]) + return self.suiteClass([test]) else: raise TypeError("calling %s returned %s, not a test" % (obj, test))