diff --git a/AUTHORS b/AUTHORS index b41e4c43d07..d740fee5ce3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -69,6 +69,7 @@ Mark Abramowitz Markus Unterwaditzer Martijn Faassen Martin Prusse +Martin K. Scherer Matt Bachmann Michael Aquilina Michael Birtwell diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4783395a8d9..adc6993ebb8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,10 @@ * +* Fix exception visualization in case the current working directory (CWD) gets + deleted during testing. Fixes (`#1235`). Thanks `@bukzor` for reporting. PR by + `@marscher`. Thanks `@nicoddemus` for his help. + .. _#1580: https://github.com/pytest-dev/pytest/issues/1580 .. _@graingert: https://github.com/graingert diff --git a/_pytest/_code/code.py b/_pytest/_code/code.py index 8995cc1f710..c6f811c85cf 100644 --- a/_pytest/_code/code.py +++ b/_pytest/_code/code.py @@ -2,7 +2,6 @@ from inspect import CO_VARARGS, CO_VARKEYWORDS import py - builtin_repr = repr reprlib = py.builtin._tryimport('repr', 'reprlib') @@ -35,12 +34,16 @@ def __ne__(self, other): def path(self): """ return a path object pointing to source code (note that it might not point to an actually existing file). """ - p = py.path.local(self.raw.co_filename) - # maybe don't try this checking - if not p.check(): + try: + p = py.path.local(self.raw.co_filename) + # maybe don't try this checking + if not p.check(): + raise OSError("py.path check failed.") + except OSError: # XXX maybe try harder like the weird logic # in the standard lib [linecache.updatecache] does? p = self.raw.co_filename + return p @property diff --git a/_pytest/main.py b/_pytest/main.py index 8654d7af627..c0a639ad0c7 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -403,7 +403,7 @@ def _repr_failure_py(self, excinfo, style=None): else: style = "long" - return excinfo.getrepr(funcargs=True, + return excinfo.getrepr(funcargs=True, abspath=True, showlocals=self.config.option.showlocals, style=style, tbfilter=tbfilter) diff --git a/testing/code/test_excinfo.py b/testing/code/test_excinfo.py index 47ad50b066c..ba047f2a9f8 100644 --- a/testing/code/test_excinfo.py +++ b/testing/code/test_excinfo.py @@ -925,3 +925,14 @@ def test_repr_traceback_with_unicode(style, encoding): repr_traceback = formatter.repr_traceback(e_info) assert repr_traceback is not None + +def test_cwd_deleted(testdir): + testdir.makepyfile(""" + def test(tmpdir): + tmpdir.chdir() + tmpdir.remove() + assert False + """) + result = testdir.runpytest() + result.stdout.fnmatch_lines(['* 1 failed in *']) + assert 'INTERNALERROR' not in result.stdout.str() + result.stderr.str()