Merge pull request #11941 from bluetech/doctest-parsefactories
doctest: fix autouse fixtures possibly not getting picked up
This commit is contained in:
commit
6c0b6c2f92
|
@ -0,0 +1 @@
|
|||
Fix a regression in pytest 8.0.0 whereby autouse fixtures defined in a module get ignored by the doctests in the module.
|
|
@ -40,7 +40,6 @@ from _pytest.nodes import Item
|
|||
from _pytest.outcomes import OutcomeException
|
||||
from _pytest.outcomes import skip
|
||||
from _pytest.pathlib import fnmatch_ex
|
||||
from _pytest.pathlib import import_path
|
||||
from _pytest.python import Module
|
||||
from _pytest.python_api import approx
|
||||
from _pytest.warning_types import PytestWarning
|
||||
|
@ -107,7 +106,7 @@ def pytest_addoption(parser: Parser) -> None:
|
|||
"--doctest-ignore-import-errors",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="Ignore doctest ImportErrors",
|
||||
help="Ignore doctest collection errors",
|
||||
dest="doctest_ignore_import_errors",
|
||||
)
|
||||
group.addoption(
|
||||
|
@ -561,17 +560,17 @@ class DoctestModule(Module):
|
|||
pass
|
||||
|
||||
try:
|
||||
module = import_path(
|
||||
self.path,
|
||||
root=self.config.rootpath,
|
||||
mode=self.config.getoption("importmode"),
|
||||
)
|
||||
except ImportError:
|
||||
module = self.obj
|
||||
except Collector.CollectError:
|
||||
if self.config.getvalue("doctest_ignore_import_errors"):
|
||||
skip("unable to import module %r" % self.path)
|
||||
else:
|
||||
raise
|
||||
|
||||
# While doctests currently don't support fixtures directly, we still
|
||||
# need to pick up autouse fixtures.
|
||||
self.session._fixturemanager.parsefactories(self)
|
||||
|
||||
# Uses internal doctest module parsing mechanism.
|
||||
finder = MockAwareDocTestFinder()
|
||||
optionflags = get_optionflags(self.config)
|
||||
|
|
|
@ -1376,6 +1376,38 @@ class TestDoctestAutoUseFixtures:
|
|||
str(result.stdout.no_fnmatch_line("*FAILURES*"))
|
||||
result.stdout.fnmatch_lines(["*=== 1 passed in *"])
|
||||
|
||||
@pytest.mark.parametrize("scope", [*SCOPES, "package"])
|
||||
def test_auto_use_defined_in_same_module(
|
||||
self, pytester: Pytester, scope: str
|
||||
) -> None:
|
||||
"""Autouse fixtures defined in the same module as the doctest get picked
|
||||
up properly.
|
||||
|
||||
Regression test for #11929.
|
||||
"""
|
||||
pytester.makepyfile(
|
||||
f"""
|
||||
import pytest
|
||||
|
||||
AUTO = "the fixture did not run"
|
||||
|
||||
@pytest.fixture(autouse=True, scope="{scope}")
|
||||
def auto(request):
|
||||
global AUTO
|
||||
AUTO = "the fixture ran"
|
||||
|
||||
def my_doctest():
|
||||
'''My doctest.
|
||||
|
||||
>>> my_doctest()
|
||||
'the fixture ran'
|
||||
'''
|
||||
return AUTO
|
||||
"""
|
||||
)
|
||||
result = pytester.runpytest("--doctest-modules")
|
||||
result.assert_outcomes(passed=1)
|
||||
|
||||
|
||||
class TestDoctestNamespaceFixture:
|
||||
SCOPES = ["module", "session", "class", "function"]
|
||||
|
|
Loading…
Reference in New Issue