Fix internal error when filtering tracebacks where one entry was generated by an exec() statement

Fix #995
This commit is contained in:
Bruno Oliveira 2015-09-29 22:29:43 -03:00
parent e9240f7eee
commit 11f100813e
3 changed files with 56 additions and 1 deletions

View File

@ -1,6 +1,10 @@
2.8.2.dev
---------
- fix #995: fixed internal error when filtering tracebacks where one entry
was generated by an exec() statement.
Thanks Daniel Hahler, Ashley C Straw, Philippe Gauthier and Pavel Savchenko
for contributing and Bruno Oliveira for the PR.
2.8.1
-----

View File

@ -49,7 +49,10 @@ def _has_positional_arg(func):
def filter_traceback(entry):
return entry.path != cutdir1 and not entry.path.relto(cutdir2)
# ensure entry.path is always a py.path.local object
# see https://bitbucket.org/pytest-dev/py/issues/71
path = py.path.local(entry.path)
return path != cutdir1 and not path.relto(cutdir2)
def get_real_func(obj):

View File

@ -733,6 +733,54 @@ class TestTracebackCutting:
"E*NameError*",
])
def test_traceback_filter_error_during_fixture_collection(self, testdir):
"""integration test for issue #995.
"""
testdir.makepyfile("""
import pytest
def fail_me(func):
ns = {}
exec('def w(): raise ValueError("fail me")', ns)
return ns['w']
@pytest.fixture(scope='class')
@fail_me
def fail_fixture():
pass
def test_failing_fixture(fail_fixture):
pass
""")
result = testdir.runpytest()
assert result.ret != 0
out = result.stdout.str()
assert "INTERNALERROR>" not in out
result.stdout.fnmatch_lines([
"*ValueError: fail me*",
"* 1 error in *",
])
def test_filter_traceback_accepts_non_paths(self):
"""test that filter_traceback() works around py.code.Code bug
where sometimes its "path" attribute is not a py.path.local object:
https://bitbucket.org/pytest-dev/py/issues/71
This fixes #995.
"""
from _pytest.python import filter_traceback
try:
ns = {}
exec('def foo(): raise ValueError', ns)
ns['foo']()
except ValueError:
import sys
_, _, tb = sys.exc_info()
tb = py.code.Traceback(tb)
assert isinstance(tb[-1].path, str) # symptom of the py.code bug
assert filter_traceback(tb[-1])
class TestReportInfo:
def test_itemreport_reportinfo(self, testdir, linecomp):
testdir.makeconftest("""