Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/14700.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed an internal error on Python 3.12 when a doctest on a fixture-decorated function was skipped.
12 changes: 12 additions & 0 deletions src/_pytest/doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from _pytest.config import Config
from _pytest.config.argparsing import Parser
from _pytest.fixtures import fixture
from _pytest.fixtures import FixtureFunctionDefinition
from _pytest.fixtures import TopRequest
from _pytest.nodes import Collector
from _pytest.nodes import Item
Expand Down Expand Up @@ -529,6 +530,17 @@ def _find_lineno(self, obj, source_lines):
obj,
source_lines,
)
elif py_ver_info_minor == (3, 12):

def _find_lineno(self, obj, source_lines):
if isinstance(obj, FixtureFunctionDefinition):
obj = inspect.unwrap(obj)

# Type ignored because this is a private function.
return super()._find_lineno( # type:ignore[misc]
obj,
source_lines,
)

if sys.version_info < (3, 13):

Expand Down
23 changes: 23 additions & 0 deletions testing/test_doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -875,6 +875,29 @@ def foo(x):
reportinfo = items[0].reportinfo()
assert reportinfo[1] == 1

@pytest.mark.skipif(
sys.version_info < (3, 12), reason="requires Python 3.12 or later"
)
def test_fixture_doctest_skip_has_line_number(self, pytester: Pytester):
p = pytester.makepyfile(
test_fixture_doctest_skip="""
import pytest

@pytest.fixture
def unavailable():
'''
>>> getfixture("unavailable")
'''
pytest.skip("unavailable")
"""
)
items, _reprec = pytester.inline_genitems(p, "--doctest-modules")
assert items[0].reportinfo()[1] is not None

result = pytester.runpytest(p, "--doctest-modules")
assert "INTERNALERROR" not in result.stdout.str()
result.assert_outcomes(skipped=1)

def test_valid_setup_py(self, pytester: Pytester):
"""
Test to make sure that pytest ignores valid setup.py files when ran
Expand Down
Loading