diff -r 5f23a6557e36 Doc/library/unittest.rst --- a/Doc/library/unittest.rst Sun Mar 13 16:36:08 2011 -0500 +++ b/Doc/library/unittest.rst Mon Mar 14 15:33:56 2011 -0400 @@ -723,7 +723,7 @@ Here, we create two instances of :class:`WidgetTestCase`, each of which runs a single test. - .. versionchanged:: + .. versionchanged:: 3.2 `TestCase` can be instantiated successfully without providing a method name. This makes it easier to experiment with `TestCase` from the interactive interpreter. @@ -792,11 +792,14 @@ Run the test, collecting the result into the test result object passed as *result*. If *result* is omitted or ``None``, a temporary result object is created (by calling the :meth:`defaultTestResult` method) and - used. The result object is not returned to :meth:`run`'s caller. + used. The result object is returned to :meth:`run`'s caller. The same effect may be had by simply calling the :class:`TestCase` instance. + .. versionchanged:: 3.3 + Previous versions of ``run`` did not return the result. Neither did + calling an instance. .. method:: skipTest(reason) diff -r 5f23a6557e36 Lib/unittest/case.py --- a/Lib/unittest/case.py Sun Mar 13 16:36:08 2011 -0500 +++ b/Lib/unittest/case.py Mon Mar 14 15:33:56 2011 -0400 @@ -469,7 +469,7 @@ warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", RuntimeWarning) result.addSuccess(self) - + return result finally: result.stopTest(self) if orig_result is None: diff -r 5f23a6557e36 Lib/unittest/test/test_case.py --- a/Lib/unittest/test/test_case.py Sun Mar 13 16:36:08 2011 -0500 +++ b/Lib/unittest/test/test_case.py Mon Mar 14 15:33:56 2011 -0400 @@ -386,27 +386,62 @@ self.assertIsInstance(Foo().id(), str) - # "If result is omitted or None, a temporary result object is created - # and used, but is not made available to the caller. As TestCase owns the + # "If result is omitted or None, a temporary result object is created, + # used, and is made available to the caller. As TestCase owns the # temporary result startTestRun and stopTestRun are called. def test_run__uses_defaultTestResult(self): events = [] + defaultResult = LoggingResult(events) class Foo(unittest.TestCase): def test(self): events.append('test') def defaultTestResult(self): - return LoggingResult(events) + return defaultResult # Make run() find a result object on its own - Foo('test').run() + result = Foo('test').run() + self.assertIs(result, defaultResult) expected = ['startTestRun', 'startTest', 'test', 'addSuccess', 'stopTest', 'stopTestRun'] self.assertEqual(events, expected) + + # "The result object is returned to run's caller" + def test_run__returns_given_result(self): + + class Foo(unittest.TestCase): + def test(self): + pass + + result = unittest.TestResult() + + retval = Foo('test').run(result) + self.assertIs(retval, result) + + + # "The same effect [as method run] may be had by simply calling the + # TestCase instance." + def test_call__invoking_an_instance_delegates_to_run(self): + resultIn = unittest.TestResult() + resultOut = unittest.TestResult() + + class Foo(unittest.TestCase): + def test(self): + pass + + def run(self, result): + self.assertIs(result, resultIn) + return resultOut + + retval = Foo('test')(resultIn) + + self.assertIs(retval, resultOut) + + def testShortDescriptionWithoutDocstring(self): self.assertIsNone(self.shortDescription()) diff -r 5f23a6557e36 Misc/ACKS --- a/Misc/ACKS Sun Mar 13 16:36:08 2011 -0500 +++ b/Misc/ACKS Mon Mar 14 15:33:56 2011 -0400 @@ -348,6 +348,7 @@ Derek Harland Jason Harper Brian Harring +Jonathan Hartley Larry Hastings Shane Hathaway Rycharde Hawkes