@@ -585,11 +585,13 @@ def _compute_fixture_value(self, fixturedef):
585
585
# call the fixture function
586
586
fixturedef .execute (request = subrequest )
587
587
finally :
588
- # if fixture function failed it might have registered finalizers
589
- self .session ._setupstate .addfinalizer (
590
- functools .partial (fixturedef .finish , request = subrequest ),
591
- subrequest .node ,
592
- )
588
+ self ._schedule_finalizers (fixturedef , subrequest )
589
+
590
+ def _schedule_finalizers (self , fixturedef , subrequest ):
591
+ # if fixture function failed it might have registered finalizers
592
+ self .session ._setupstate .addfinalizer (
593
+ functools .partial (fixturedef .finish , request = subrequest ), subrequest .node
594
+ )
593
595
594
596
def _check_scope (self , argname , invoking_scope , requested_scope ):
595
597
if argname == "request" :
@@ -659,6 +661,16 @@ def __repr__(self):
659
661
def addfinalizer (self , finalizer ):
660
662
self ._fixturedef .addfinalizer (finalizer )
661
663
664
+ def _schedule_finalizers (self , fixturedef , subrequest ):
665
+ # if the executing fixturedef was not explicitly requested in the argument list (via
666
+ # getfixturevalue inside the fixture call) then ensure this fixture def will be finished
667
+ # first
668
+ if fixturedef .argname not in self .funcargnames :
669
+ fixturedef .addfinalizer (
670
+ functools .partial (self ._fixturedef .finish , request = self )
671
+ )
672
+ super (SubRequest , self )._schedule_finalizers (fixturedef , subrequest )
673
+
662
674
663
675
scopes = "session package module class function" .split ()
664
676
scopenum_function = scopes .index ("function" )
@@ -858,6 +870,7 @@ def finish(self, request):
858
870
def execute (self , request ):
859
871
# get required arguments and register our own finish()
860
872
# with their finalization
873
+ # TODO CHECK HOW TO AVOID EXPLICITLY FINALIZING AGAINST ARGNAMES
861
874
for argname in self .argnames :
862
875
fixturedef = request ._get_active_fixturedef (argname )
863
876
if argname != "request" :
0 commit comments