MCPcopy
hub / github.com/vitest-dev/vitest / resolveFixtureFunction

Function resolveFixtureFunction

packages/runner/src/fixture.ts:499–552  ·  view source on GitHub ↗
(
  fixtureFn: (
    context: unknown,
    useFn: (arg: unknown) => Promise<void>,
  ) => Promise<void>,
  fixtureName: string,
  context: unknown,
  cleanupFnArray: (() => void | Promise<void>)[],
)

Source from the content-addressed store, hash-verified

497}
498
499async function resolveFixtureFunction(
500 fixtureFn: (
501 context: unknown,
502 useFn: (arg: unknown) => Promise<void>,
503 ) => Promise<void>,
504 fixtureName: string,
505 context: unknown,
506 cleanupFnArray: (() => void | Promise<void>)[],
507): Promise<unknown> {
508 // wait for `use` call to extract fixture value
509 const useFnArgPromise = createDefer()
510 const stackTraceError
511 = FIXTURE_STACK_TRACE_KEY in fixtureFn && fixtureFn[FIXTURE_STACK_TRACE_KEY] instanceof Error
512 ? fixtureFn[FIXTURE_STACK_TRACE_KEY]
513 : undefined
514 let isUseFnArgResolved = false
515
516 const fixtureReturn = fixtureFn(context, async (useFnArg: unknown) => {
517 // extract `use` argument
518 isUseFnArgResolved = true
519 useFnArgPromise.resolve(useFnArg)
520
521 // suspend fixture teardown by holding off `useReturnPromise` resolution until cleanup
522 const useReturnPromise = createDefer<void>()
523 cleanupFnArray.push(async () => {
524 // start teardown by resolving `use` Promise
525 useReturnPromise.resolve()
526 // wait for finishing teardown
527 await fixtureReturn
528 })
529 await useReturnPromise
530 }).then(() => {
531 // fixture returned without calling use()
532 if (!isUseFnArgResolved) {
533 const error = new Error(
534 `Fixture "${fixtureName}" returned without calling "use". Make sure to call "use" in every code path of the fixture function.`,
535 )
536 if (stackTraceError?.stack) {
537 error.stack = error.message + stackTraceError.stack.replace(stackTraceError.message, '')
538 }
539 useFnArgPromise.reject(error)
540 }
541 }).catch((e: unknown) => {
542 // treat fixture setup error as test failure
543 if (!isUseFnArgResolved) {
544 useFnArgPromise.reject(e)
545 return
546 }
547 // otherwise re-throw to avoid silencing error during cleanup
548 throw e
549 })
550
551 return useFnArgPromise
552}
553
554function resolveDeps(
555 usedFixtures: TestFixtureItem[],

Callers 2

resolveTestFixtureValueFunction · 0.85
resolveScopeFixtureValueFunction · 0.85

Calls 3

createDeferFunction · 0.90
resolveMethod · 0.45
rejectMethod · 0.45

Tested by

no test coverage detected