Fix `reload()` with modules handled via `python_files`
If a module exists in `sys.modules` already, `load_module` has to return it. Fixes https://bitbucket.org/pytest-dev/pytest/issue/435 --HG-- branch : fix-reload
This commit is contained in:
		
							parent
							
								
									41e6b04f0b
								
							
						
					
					
						commit
						c629f6b18b
					
				|  | @ -146,6 +146,12 @@ class AssertionRewritingHook(object): | ||||||
|         return self |         return self | ||||||
| 
 | 
 | ||||||
|     def load_module(self, name): |     def load_module(self, name): | ||||||
|  |         # If there is an existing module object named 'fullname' in | ||||||
|  |         # sys.modules, the loader must use that existing module. (Otherwise, | ||||||
|  |         # the reload() builtin will not work correctly.) | ||||||
|  |         if name in sys.modules: | ||||||
|  |             return sys.modules[name] | ||||||
|  | 
 | ||||||
|         co, pyc = self.modules.pop(name) |         co, pyc = self.modules.pop(name) | ||||||
|         # I wish I could just call imp.load_compiled here, but __file__ has to |         # I wish I could just call imp.load_compiled here, but __file__ has to | ||||||
|         # be set properly. In Python 3.2+, this all would be handled correctly |         # be set properly. In Python 3.2+, this all would be handled correctly | ||||||
|  |  | ||||||
|  | @ -641,3 +641,27 @@ class TestAssertionRewriteHookDetails(object): | ||||||
|         pyc.write(contents[:strip_bytes], mode='wb') |         pyc.write(contents[:strip_bytes], mode='wb') | ||||||
| 
 | 
 | ||||||
|         assert _read_pyc(source, str(pyc)) is None  # no error |         assert _read_pyc(source, str(pyc)) is None  # no error | ||||||
|  | 
 | ||||||
|  |     def test_reload_is_same(self, testdir): | ||||||
|  |         # A file that will be picked up during collecting. | ||||||
|  |         testdir.tmpdir.join("file.py").ensure() | ||||||
|  |         testdir.tmpdir.join("pytest.ini").write(py.std.textwrap.dedent(""" | ||||||
|  |             [pytest] | ||||||
|  |             python_files = *.py | ||||||
|  |         """)) | ||||||
|  | 
 | ||||||
|  |         testdir.makepyfile(test_fun=""" | ||||||
|  |             import sys | ||||||
|  |             try: | ||||||
|  |                 from imp import reload | ||||||
|  |             except ImportError: | ||||||
|  |                 pass | ||||||
|  | 
 | ||||||
|  |             def test_loader(): | ||||||
|  |                 import file | ||||||
|  |                 assert sys.modules["file"] is reload(file) | ||||||
|  |             """) | ||||||
|  |         result = testdir.runpytest('-s') | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "* 1 passed*", | ||||||
|  |         ]) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue