@@ -353,32 +353,7 @@ def run(self, result=None):
353
353
except Exception :
354
354
result .addError (self , sys .exc_info ())
355
355
else :
356
- try :
357
- testMethod ()
358
- except self .failureException :
359
- result .addFailure (self , sys .exc_info ())
360
- except _ExpectedFailure , e :
361
- addExpectedFailure = getattr (result , 'addExpectedFailure' , None )
362
- if addExpectedFailure is not None :
363
- addExpectedFailure (self , e .exc_info , e .bugnumber )
364
- else :
365
- warnings .warn ("Use of a TestResult without an addExpectedFailure method is deprecated" ,
366
- DeprecationWarning )
367
- result .addSuccess (self )
368
- except _UnexpectedSuccess , x :
369
- addUnexpectedSuccess = getattr (result , 'addUnexpectedSuccess' , None )
370
- if addUnexpectedSuccess is not None :
371
- addUnexpectedSuccess (self , x .bugnumber )
372
- else :
373
- warnings .warn ("Use of a TestResult without an addUnexpectedSuccess method is deprecated" ,
374
- DeprecationWarning )
375
- result .addFailure (self , sys .exc_info ())
376
- except SkipTest , e :
377
- self ._addSkip (result , str (e ))
378
- except Exception :
379
- result .addError (self , sys .exc_info ())
380
- else :
381
- success = True
356
+ success = self .runMethod (testMethod , result )
382
357
383
358
try :
384
359
self .tearDown ()
@@ -399,6 +374,42 @@ def run(self, result=None):
399
374
if stopTestRun is not None :
400
375
stopTestRun ()
401
376
377
+ def runMethod (self , testMethod , result ):
378
+ """Runs the test method and catches any exception that might be thrown.
379
+
380
+ This is factored out of TestCase.run() to ensure that any exception
381
+ thrown during the test goes out of scope before tearDown. Otherwise, an
382
+ exception could hold references to Python objects that are bound to
383
+ SB objects and prevent them from being deleted in time.
384
+ """
385
+ try :
386
+ testMethod ()
387
+ except self .failureException :
388
+ result .addFailure (self , sys .exc_info ())
389
+ except _ExpectedFailure , e :
390
+ addExpectedFailure = getattr (result , 'addExpectedFailure' , None )
391
+ if addExpectedFailure is not None :
392
+ addExpectedFailure (self , e .exc_info , e .bugnumber )
393
+ else :
394
+ warnings .warn ("Use of a TestResult without an addExpectedFailure method is deprecated" ,
395
+ DeprecationWarning )
396
+ result .addSuccess (self )
397
+ except _UnexpectedSuccess , x :
398
+ addUnexpectedSuccess = getattr (result , 'addUnexpectedSuccess' , None )
399
+ if addUnexpectedSuccess is not None :
400
+ addUnexpectedSuccess (self , x .bugnumber )
401
+ else :
402
+ warnings .warn ("Use of a TestResult without an addUnexpectedSuccess method is deprecated" ,
403
+ DeprecationWarning )
404
+ result .addFailure (self , sys .exc_info ())
405
+ except SkipTest , e :
406
+ self ._addSkip (result , str (e ))
407
+ except Exception :
408
+ result .addError (self , sys .exc_info ())
409
+ else :
410
+ return True
411
+ return False
412
+
402
413
def doCleanups (self ):
403
414
"""Execute all cleanup functions. Normally called for you after
404
415
tearDown."""
0 commit comments