diff --git a/py/test/outcome.py b/py/test/outcome.py index 71e60f8f4..2f9b1d262 100644 --- a/py/test/outcome.py +++ b/py/test/outcome.py @@ -49,19 +49,22 @@ def exit(msg): __tracebackhide__ = True raise Exit(msg) -def skip(msg="", ifraises=None): +def skip(msg="", ifraises=None, ns=None): """ (conditionally) skip this test/module/conftest. + msg: use this message when skipping. ifraises: if "exec ifraises in {'py': py}" raises an exception skip this test. - msg: use this message when skipping. + ns: use this namespace when executing ifraises """ __tracebackhide__ = True if ifraises is not None: ifraises = py.code.Source(ifraises).compile() + if ns is None: + ns = {} try: - exec ifraises in {'py': py} + exec ifraises in ns except (KeyboardInterrupt, SystemExit): raise except Exception, e: diff --git a/py/test/testing/acceptance_test.py b/py/test/testing/acceptance_test.py index dde8d62ae..c6d9aa5c6 100644 --- a/py/test/testing/acceptance_test.py +++ b/py/test/testing/acceptance_test.py @@ -387,10 +387,7 @@ class TestPyTest(AcceptBase): class TestInteractive(AcceptBase): def getspawn(self): - try: - import pexpect - except ImportError: - py.test.skip("cannot import pexpect") + py.test.skip(ifraises="import pexpect", ns=globals()) def spawn(cmd): return pexpect.spawn(cmd, logfile=self.tmpdir.join("spawn.out").open("w")) return spawn diff --git a/py/test/testing/test_outcome.py b/py/test/testing/test_outcome.py index 6589dbdb2..f5f15c50a 100644 --- a/py/test/testing/test_outcome.py +++ b/py/test/testing/test_outcome.py @@ -76,6 +76,11 @@ def test_skip_ifraises(): assert excinfo.traceback[-1].ishidden() assert excinfo.value.msg.startswith("ImportError") +def test_skip_ifraises_ns(): + d = {} + py.test.skip(ns=d, ifraises="import py") + assert d['py'] == py + def test_skip_ifraises_syntaxerror(): try: excinfo = py.test.raises(SyntaxError, '''