doctest: handle any OutcomeException (#6669)
Fixes using `pytest.xfail()` and `pytest.importorskip()` in doctests. Ref: https://github.com/pytest-dev/pytest/issues/310
This commit is contained in:
parent
442f7a7706
commit
f95c7f5803
|
@ -0,0 +1 @@
|
||||||
|
Add support for calling `pytest.xfail()` and `pytest.importorskip()` with doctests.
|
|
@ -24,7 +24,7 @@ from _pytest._io import TerminalWriter
|
||||||
from _pytest.compat import safe_getattr
|
from _pytest.compat import safe_getattr
|
||||||
from _pytest.compat import TYPE_CHECKING
|
from _pytest.compat import TYPE_CHECKING
|
||||||
from _pytest.fixtures import FixtureRequest
|
from _pytest.fixtures import FixtureRequest
|
||||||
from _pytest.outcomes import Skipped
|
from _pytest.outcomes import OutcomeException
|
||||||
from _pytest.python_api import approx
|
from _pytest.python_api import approx
|
||||||
from _pytest.warning_types import PytestWarning
|
from _pytest.warning_types import PytestWarning
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ def _init_runner_class() -> "Type[doctest.DocTestRunner]":
|
||||||
raise failure
|
raise failure
|
||||||
|
|
||||||
def report_unexpected_exception(self, out, test, example, exc_info):
|
def report_unexpected_exception(self, out, test, example, exc_info):
|
||||||
if isinstance(exc_info[1], Skipped):
|
if isinstance(exc_info[1], OutcomeException):
|
||||||
raise exc_info[1]
|
raise exc_info[1]
|
||||||
if isinstance(exc_info[1], bdb.BdbQuit):
|
if isinstance(exc_info[1], bdb.BdbQuit):
|
||||||
outcomes.exit("Quitting debugger")
|
outcomes.exit("Quitting debugger")
|
||||||
|
|
|
@ -186,17 +186,41 @@ class TestDoctests:
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_doctest_skip(self, testdir):
|
def test_doctest_outcomes(self, testdir):
|
||||||
testdir.maketxtfile(
|
testdir.maketxtfile(
|
||||||
"""
|
test_skip="""
|
||||||
>>> 1
|
>>> 1
|
||||||
1
|
1
|
||||||
>>> import pytest
|
>>> import pytest
|
||||||
>>> pytest.skip("")
|
>>> pytest.skip("")
|
||||||
"""
|
>>> 2
|
||||||
|
3
|
||||||
|
""",
|
||||||
|
test_xfail="""
|
||||||
|
>>> import pytest
|
||||||
|
>>> pytest.xfail("xfail_reason")
|
||||||
|
>>> foo
|
||||||
|
bar
|
||||||
|
""",
|
||||||
|
test_importorskip="""
|
||||||
|
>>> import pytest
|
||||||
|
>>> pytest.importorskip("doesnotexist")
|
||||||
|
>>> foo
|
||||||
|
bar
|
||||||
|
""",
|
||||||
)
|
)
|
||||||
result = testdir.runpytest("--doctest-modules")
|
result = testdir.runpytest("--doctest-modules")
|
||||||
result.stdout.fnmatch_lines(["*1 skipped*"])
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
"collected 3 items",
|
||||||
|
"",
|
||||||
|
"test_importorskip.txt s *",
|
||||||
|
"test_skip.txt s *",
|
||||||
|
"test_xfail.txt x *",
|
||||||
|
"",
|
||||||
|
"*= 2 skipped, 1 xfailed in *",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def test_docstring_partial_context_around_error(self, testdir):
|
def test_docstring_partial_context_around_error(self, testdir):
|
||||||
"""Test that we show some context before the actual line of a failing
|
"""Test that we show some context before the actual line of a failing
|
||||||
|
|
Loading…
Reference in New Issue