diff options
-rw-r--r-- | Doc/whatsnew/2.7.rst | 3 | ||||
-rw-r--r-- | Lib/test/test_unittest.py | 41 | ||||
-rw-r--r-- | 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 6089d33..622da3e 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 2fab7de..79ee982 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -555,6 +555,47 @@ class Test_TestLoader(TestCase): 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" # # What happens if the callable returns something else? diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index 21c7ed0..21520f5 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)) |