[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

refactor(runner): organize code for `resolveFixtures` (#4716)

authored by

Hiroshi Ogawa and committed by
GitHub
(Dec 28, 2023, 4:55 PM +0100) 09646f10 578db5e3

+37 -31
+37 -31
packages/runner/src/fixture.ts
··· 85 85 if (fixtureValueMap.has(fixture)) 86 86 continue 87 87 88 - let resolvedValue: unknown 89 - if (fixture.isFn) { 90 - // wait for `use` call to extract fixture value 91 - const useFnArgPromise = createDefer() 92 - let isUseFnArgResolved = false 93 - const fixtureReturn = fixture.value(context, async (useFnArg: unknown) => { 94 - isUseFnArgResolved = true 95 - useFnArgPromise.resolve(useFnArg) 96 - // suspend fixture teardown until cleanup 97 - const useReturnPromise = createDefer<void>() 98 - cleanupFnArray.push(async () => { 99 - // start teardown by resolving `use` Promise 100 - useReturnPromise.resolve() 101 - // wait for finishing teardown 102 - await fixtureReturn 103 - }) 104 - await useReturnPromise 105 - }).catch((e: unknown) => { 106 - // treat fixture setup error as test failure 107 - if (!isUseFnArgResolved) { 108 - useFnArgPromise.reject(e) 109 - return 110 - } 111 - // otherwise re-throw to avoid silencing error during cleanup 112 - throw e 113 - }) 114 - resolvedValue = await useFnArgPromise 115 - } 116 - else { 117 - resolvedValue = fixture.value 118 - } 88 + const resolvedValue = fixture.isFn ? await resolveFixtureFunction(fixture.value, context, cleanupFnArray) : fixture.value 119 89 context![fixture.prop] = resolvedValue 120 90 fixtureValueMap.set(fixture, resolvedValue) 121 91 cleanupFnArray.unshift(() => { ··· 126 96 127 97 return resolveFixtures().then(() => fn(context)) 128 98 } 99 + } 100 + 101 + async function resolveFixtureFunction( 102 + fixtureFn: (context: unknown, useFn: (arg: unknown) => Promise<void>) => Promise<void>, 103 + context: unknown, 104 + cleanupFnArray: (() => (void | Promise<void>))[], 105 + ): Promise<unknown> { 106 + // wait for `use` call to extract fixture value 107 + const useFnArgPromise = createDefer() 108 + let isUseFnArgResolved = false 109 + 110 + const fixtureReturn = fixtureFn(context, async (useFnArg: unknown) => { 111 + // extract `use` argument 112 + isUseFnArgResolved = true 113 + useFnArgPromise.resolve(useFnArg) 114 + 115 + // suspend fixture teardown by holding off `useReturnPromise` resolution until cleanup 116 + const useReturnPromise = createDefer<void>() 117 + cleanupFnArray.push(async () => { 118 + // start teardown by resolving `use` Promise 119 + useReturnPromise.resolve() 120 + // wait for finishing teardown 121 + await fixtureReturn 122 + }) 123 + await useReturnPromise 124 + }).catch((e: unknown) => { 125 + // treat fixture setup error as test failure 126 + if (!isUseFnArgResolved) { 127 + useFnArgPromise.reject(e) 128 + return 129 + } 130 + // otherwise re-throw to avoid silencing error during cleanup 131 + throw e 132 + }) 133 + 134 + return useFnArgPromise 129 135 } 130 136 131 137 function resolveDeps(fixtures: FixtureItem[], depSet = new Set<FixtureItem>(), pendingFixtures: FixtureItem[] = []) {