pytester: add method ``TmpTestdir.delete_loaded_modules()``
, and call it from ``inline_run()`` to allow temporary modules to be reloaded. --HG-- branch : pytester-inline-run-clean-sys-modules
This commit is contained in:
parent
c792ab8aed
commit
bc0ecd1d06
1
AUTHORS
1
AUTHORS
|
@ -48,3 +48,4 @@ Nicolas Delaby
|
||||||
Tom Viner
|
Tom Viner
|
||||||
Dave Hunt
|
Dave Hunt
|
||||||
Charles Cloud
|
Charles Cloud
|
||||||
|
schettino72
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
2.8.0.dev (compared to 2.7.X)
|
2.8.0.dev (compared to 2.7.X)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
- pytester: add method ``TmpTestdir.delete_loaded_modules()``, and call it
|
||||||
|
from ``inline_run()`` to allow temporary modules to be reloaded.
|
||||||
|
|
||||||
2.7.1.dev (compared to 2.7.0)
|
2.7.1.dev (compared to 2.7.0)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
|
@ -266,7 +266,7 @@ class TmpTestdir:
|
||||||
|
|
||||||
Some methods modify the global interpreter state and this
|
Some methods modify the global interpreter state and this
|
||||||
tries to clean this up. It does not remove the temporary
|
tries to clean this up. It does not remove the temporary
|
||||||
directlry however so it can be looked at after the test run
|
directory however so it can be looked at after the test run
|
||||||
has finished.
|
has finished.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -274,7 +274,15 @@ class TmpTestdir:
|
||||||
sys.path.remove(p)
|
sys.path.remove(p)
|
||||||
if hasattr(self, '_olddir'):
|
if hasattr(self, '_olddir'):
|
||||||
self._olddir.chdir()
|
self._olddir.chdir()
|
||||||
# delete modules that have been loaded from tmpdir
|
self.delete_loaded_modules()
|
||||||
|
|
||||||
|
def delete_loaded_modules(self):
|
||||||
|
"""Delete modules that have been loaded from tmpdir.
|
||||||
|
|
||||||
|
This allows the interpreter to catch module changes in case
|
||||||
|
the module is re-imported.
|
||||||
|
|
||||||
|
"""
|
||||||
for name, mod in list(sys.modules.items()):
|
for name, mod in list(sys.modules.items()):
|
||||||
if mod:
|
if mod:
|
||||||
fn = getattr(mod, '__file__', None)
|
fn = getattr(mod, '__file__', None)
|
||||||
|
@ -539,6 +547,7 @@ class TmpTestdir:
|
||||||
assert len(rec) == 1
|
assert len(rec) == 1
|
||||||
reprec = rec[0]
|
reprec = rec[0]
|
||||||
reprec.ret = ret
|
reprec.ret = ret
|
||||||
|
self.delete_loaded_modules()
|
||||||
return reprec
|
return reprec
|
||||||
|
|
||||||
def parseconfig(self, *args):
|
def parseconfig(self, *args):
|
||||||
|
|
|
@ -2,6 +2,8 @@ import pytest
|
||||||
import os
|
import os
|
||||||
from _pytest.pytester import HookRecorder
|
from _pytest.pytester import HookRecorder
|
||||||
from _pytest.core import PluginManager
|
from _pytest.core import PluginManager
|
||||||
|
from _pytest.main import EXIT_OK, EXIT_TESTSFAILED
|
||||||
|
|
||||||
|
|
||||||
def test_make_hook_recorder(testdir):
|
def test_make_hook_recorder(testdir):
|
||||||
item = testdir.getitem("def test_func(): pass")
|
item = testdir.getitem("def test_func(): pass")
|
||||||
|
@ -121,3 +123,12 @@ def test_inprocess_plugins(testdir):
|
||||||
testdir.inprocess_run([], [plugin])
|
testdir.inprocess_run([], [plugin])
|
||||||
|
|
||||||
assert plugin.configured
|
assert plugin.configured
|
||||||
|
|
||||||
|
def test_inline_run_clean_modules(testdir):
|
||||||
|
test_mod = testdir.makepyfile("def test_foo(): assert True")
|
||||||
|
result = testdir.inline_run(str(test_mod))
|
||||||
|
assert result.ret == EXIT_OK
|
||||||
|
# rewrite module, now test should fail if module was re-imported
|
||||||
|
test_mod.write("def test_foo(): assert False")
|
||||||
|
result2 = testdir.inline_run(str(test_mod))
|
||||||
|
assert result2.ret == EXIT_TESTSFAILED
|
||||||
|
|
Loading…
Reference in New Issue