Skip to content

Commit 487659d

Browse files
aklajnertAndrzej Klajnert
authored andcommitted
Fix the scope behavior with indirect fixtures.
1 parent 955e542 commit 487659d

File tree

4 files changed

+51
-3
lines changed

4 files changed

+51
-3
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Andras Tim
2323
Andrea Cimatoribus
2424
Andreas Zeidler
2525
Andrey Paramonov
26+
Andrzej Klajnert
2627
Andrzej Ostrowski
2728
Andy Freeland
2829
Anthon van der Neut

changelog/570.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix the scope behavior with indirect fixtures.

src/_pytest/fixtures.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ def execute(self, request):
859859
if argname != "request":
860860
fixturedef.addfinalizer(functools.partial(self.finish, request=request))
861861

862-
my_cache_key = request.param_index
862+
my_cache_key = self.cache_key(request)
863863
cached_result = getattr(self, "cached_result", None)
864864
if cached_result is not None:
865865
result, cache_key, err = cached_result
@@ -877,6 +877,9 @@ def execute(self, request):
877877
hook = self._fixturemanager.session.gethookproxy(request.node.fspath)
878878
return hook.pytest_fixture_setup(fixturedef=self, request=request)
879879

880+
def cache_key(self, request):
881+
return request.param_index if not hasattr(request, "param") else request.param
882+
880883
def __repr__(self):
881884
return "<FixtureDef argname={!r} scope={!r} baseid={!r}>".format(
882885
self.argname, self.scope, self.baseid
@@ -913,7 +916,7 @@ def pytest_fixture_setup(fixturedef, request):
913916
kwargs[argname] = result
914917

915918
fixturefunc = resolve_fixture_function(fixturedef, request)
916-
my_cache_key = request.param_index
919+
my_cache_key = fixturedef.cache_key(request)
917920
try:
918921
result = call_fixture_func(fixturefunc, request, kwargs)
919922
except TEST_OUTCOME:

testing/python/fixtures.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,8 @@ def test_lookup_error(unknown):
449449
"*ERROR at setup of test_lookup_error*",
450450
" def test_lookup_error(unknown):*",
451451
"E fixture 'unknown' not found",
452-
"> available fixtures:*a_fixture,*b_fixture,*c_fixture,*d_fixture*monkeypatch,*", # sorted
452+
"> available fixtures:*a_fixture,*b_fixture,*c_fixture,*d_fixture*monkeypatch,*",
453+
# sorted
453454
"> use 'py*test --fixtures *' for help on them.",
454455
"*1 error*",
455456
]
@@ -4009,3 +4010,45 @@ def test_fixture_named_request(testdir):
40094010
" *test_fixture_named_request.py:5",
40104011
]
40114012
)
4013+
4014+
4015+
def test_indirect_fixture(testdir):
4016+
testdir.makepyfile(
4017+
"""
4018+
from collections import Counter
4019+
4020+
import pytest
4021+
4022+
4023+
@pytest.fixture(scope="session")
4024+
def fixture_1(request, count=Counter()):
4025+
count[request.param] += 1
4026+
yield count[request.param]
4027+
4028+
4029+
@pytest.fixture(scope="session")
4030+
def fixture_2(request):
4031+
yield request.param
4032+
4033+
4034+
scenarios = [
4035+
("a", "a1"),
4036+
("a", "a2"),
4037+
("b", "b1"),
4038+
("b", "b2"),
4039+
("c", "c1"),
4040+
("c", "c2"),
4041+
]
4042+
4043+
4044+
@pytest.mark.parametrize(
4045+
"fixture_1,fixture_2", scenarios, indirect=["fixture_1", "fixture_2"]
4046+
)
4047+
def test_it(fixture_1, fixture_2):
4048+
assert fixture_1 == 1
4049+
assert fixture_2[1] in ("1", "2")
4050+
4051+
"""
4052+
)
4053+
result = testdir.runpytest()
4054+
result.assert_outcomes(passed=6)

0 commit comments

Comments
 (0)