@@ -50,11 +50,6 @@ class _instances:
5050 reactor = None
5151
5252
53- class _tracking :
54- async_yield_fixture_cache = {}
55- to_be_torn_down = []
56-
57-
5853def _deprecate (deprecated , recommended ):
5954 def decorator (f ):
6055 @functools .wraps (f )
@@ -282,6 +277,16 @@ def pytest_fixture_setup(fixturedef, request):
282277 return not None
283278
284279
280+ def _create_async_yield_fixture_finalizer (coroutine ):
281+ def finalizer ():
282+ _run_inline_callbacks (
283+ _tear_it_down ,
284+ defer .ensureDeferred (coroutine .__anext__ ()),
285+ )
286+
287+ return finalizer
288+
289+
285290@defer .inlineCallbacks
286291def _async_pytest_fixture_setup (fixturedef , request , mark ):
287292 """Setup an async or async yield fixture."""
@@ -299,15 +304,11 @@ def _async_pytest_fixture_setup(fixturedef, request, mark):
299304 elif mark == 'async_yield_fixture' :
300305 coroutine = fixture_function (** kwargs )
301306
302- finalizer = functools .partial (
303- _tracking .to_be_torn_down .append ,
304- coroutine ,
307+ request .addfinalizer (
308+ _create_async_yield_fixture_finalizer (coroutine = coroutine ),
305309 )
306- request .addfinalizer (finalizer )
307310
308- arg_value = yield defer .ensureDeferred (
309- coroutine .__anext__ (),
310- )
311+ arg_value = yield defer .ensureDeferred (coroutine .__anext__ ())
311312 else :
312313 raise UnrecognizedCoroutineMarkError .from_mark (mark = mark )
313314
@@ -348,22 +349,6 @@ def in_reactor(d, f, *args):
348349 blockingCallFromThread (_instances .reactor , f , * args )
349350
350351
351- @pytest .hookimpl (hookwrapper = True )
352- def pytest_runtest_teardown (item ):
353- """Tear down collected async yield fixtures."""
354- yield
355-
356- deferreds = []
357- while len (_tracking .to_be_torn_down ) > 0 :
358- coroutine = _tracking .to_be_torn_down .pop (0 )
359- deferred = defer .ensureDeferred (coroutine .__anext__ ())
360-
361- deferreds .append (deferred )
362-
363- for deferred in deferreds :
364- _run_inline_callbacks (_tear_it_down , deferred )
365-
366-
367352def pytest_pyfunc_call (pyfuncitem ):
368353 """Interface to async test call handler."""
369354 # TODO: only handle 'our' tests? what is the point of handling others?
0 commit comments