diff -r 3fbfa61634de Lib/unittest/loader.py --- a/Lib/unittest/loader.py Thu Jul 19 00:14:35 2012 -0500 +++ b/Lib/unittest/loader.py Fri Jul 20 15:32:39 2012 -0300 @@ -170,6 +170,8 @@ packages can continue discovery themselves. top_level_dir is stored so load_tests does not need to pass this argument in to loader.discover(). """ + previous_top_level_dir = self._top_level_dir + set_implicit_top = False if top_level_dir is None and self._top_level_dir is not None: # make top_level_dir optional if called from load_tests in a package @@ -211,6 +213,7 @@ raise ImportError('Start directory is not importable: %r' % start_dir) tests = list(self._find_tests(start_dir, pattern)) + self._top_level_dir = previous_top_level_dir return self.suiteClass(tests) def _get_directory_containing_module(self, module_name): diff -r 3fbfa61634de Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py Thu Jul 19 00:14:35 2012 -0500 +++ b/Lib/unittest/test/test_discovery.py Fri Jul 20 15:32:39 2012 -0300 @@ -180,10 +180,50 @@ top_level_dir = os.path.abspath('/foo/bar') start_dir = os.path.abspath('/foo/bar/baz') self.assertEqual(suite, "['tests']") - self.assertEqual(loader._top_level_dir, top_level_dir) self.assertEqual(_find_tests_args, [(start_dir, 'pattern')]) self.assertIn(top_level_dir, sys.path) + def test_discover_should_not_persist_top_level_dir_between_calls(self): + loader = unittest.TestLoader() + + original_isfile = os.path.isfile + def restore_isfile(): + os.path.isfile = original_isfile + + os.path.isfile = lambda path: True + self.addCleanup(restore_isfile) + + original_isdir = os.path.isdir + def restore_isdir(): + os.path.isdir = original_isdir + + os.path.isdir = lambda path: True + self.addCleanup(restore_isdir) + + orig_sys_path = sys.path[:] + def restore_path(): + sys.path[:] = orig_sys_path + self.addCleanup(restore_path) + + def _find_tests(start_dir, pattern): + return ['tests'] + loader._find_tests = _find_tests + loader.suiteClass = str + + loader.discover('/first/one/dir', 'pattern', '/first/one') + loader.discover('/second/two/dir', 'pattern', '/second/two') + + # restores to default + self.assertEqual(loader._top_level_dir, None) + + loader._top_level_dir = '/previous/dir' + + loader.discover('/first/one/dir', 'pattern', '/first/one') + loader.discover('/second/two/dir', 'pattern', '/second/two') + + # restores to previous value + self.assertEqual(loader._top_level_dir, '/previous/dir') + def test_discover_with_modules_that_fail_to_import(self): loader = unittest.TestLoader()