From ea6a18fa39cd37c695be69eb9016d993576cc1ef Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 11:57:57 +0900 Subject: [PATCH 01/11] fix: resolve fixture overrides from test's suite in beforeEach hooks (#9810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `withFixtures()` captured the suite at collection time, so `beforeEach` hooks declared at file-level used the file suite to look up overrides — missing overrides registered in nested `describe` blocks. Use `hookContext.task.suite` at execution time instead. Co-Authored-By: Claude Opus 4.6 --- packages/runner/src/fixture.ts | 5 ++++- test/core/test/test-extend.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 470a15145bbf..e93ee727dbe1 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -297,7 +297,7 @@ const contextHasFixturesCache = new WeakMap => { const context: (TestContext & { [key: string]: any }) | undefined = hookContext || options?.context as TestContext @@ -314,6 +314,9 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { return fn(context) } + // Use the test's parent suite when available so that beforeEach/afterEach + // hooks pick up fixture overrides registered in the test's describe block + const suite = hookContext?.task?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { return fn(context) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index 9ef88738229d..5d186c593b39 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -640,3 +640,25 @@ describe('builder pattern with non-function values', () => { expect(chainedSync).toBe('HELLO WORLD') }) }) + +// https://github.com/vitest-dev/vitest/issues/9810 +describe('override affects auto fixtures that depend on overridden fixture', () => { + const myTest = test + .extend('config', { auto: true }, () => 'config:default') + .extend('server', { auto: true }, ({ config }) => { + return `server:${config}` + }) + + beforeEach(({ task }) => { + expect(task).toBeTruthy() + }) + + describe('with override', () => { + myTest.override('config', 'config:override') + + myTest('auto fixture sees overridden dependency', ({ config, server }) => { + expect(config).toBe('config:override') + expect(server).toBe('server:config:override') + }) + }) +}) From 41744db2d1ace69bee0b2556c01bc1c1de4ff32f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:05:35 +0900 Subject: [PATCH 02/11] fix: use context.task?.suite instead of hookContext?.task?.suite Co-Authored-By: Claude Opus 4.6 --- packages/runner/src/fixture.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index e93ee727dbe1..38f6e0a207ae 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -316,7 +316,7 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { // Use the test's parent suite when available so that beforeEach/afterEach // hooks pick up fixture overrides registered in the test's describe block - const suite = hookContext?.task?.suite ?? collectorSuite + const suite = context.task?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { return fn(context) From f582e1335734d827a7dccc7b36f1983fb8e1b612 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:10:58 +0900 Subject: [PATCH 03/11] test: add variant tests for override + beforeEach fixture resolution Cover: beforeEach inside override describe, non-auto fixtures with override, non-auto fixture accessed in beforeEach, and nested overrides. Co-Authored-By: Claude Opus 4.6 --- test/core/test/test-extend.test.ts | 80 ++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index 5d186c593b39..1c65e71c6596 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -642,23 +642,97 @@ describe('builder pattern with non-function values', () => { }) // https://github.com/vitest-dev/vitest/issues/9810 -describe('override affects auto fixtures that depend on overridden fixture', () => { +describe('override with beforeEach resolves from test suite', () => { const myTest = test .extend('config', { auto: true }, () => 'config:default') .extend('server', { auto: true }, ({ config }) => { return `server:${config}` }) + // file-level beforeEach triggers auto fixture resolution beforeEach(({ task }) => { expect(task).toBeTruthy() }) - describe('with override', () => { + describe('auto fixture sees overridden dependency', () => { myTest.override('config', 'config:override') - myTest('auto fixture sees overridden dependency', ({ config, server }) => { + myTest('override applies to auto fixture', ({ config, server }) => { expect(config).toBe('config:override') expect(server).toBe('server:config:override') }) }) + + describe('beforeEach inside override describe (already working)', () => { + myTest.override('config', 'config:inner') + + beforeEach(({ task }) => { + expect(task).toBeTruthy() + }) + + myTest('override applies when beforeEach is co-located', ({ config, server }) => { + expect(config).toBe('config:inner') + expect(server).toBe('server:config:inner') + }) + }) + + describe('non-auto fixture with override and file-level beforeEach', () => { + const manualTest = test + .extend('config', () => 'config:default') + .extend('derived', ({ config }) => `derived:${config}`) + + describe('with override', () => { + manualTest.override('config', 'config:override') + + manualTest('override applies to non-auto dependency', ({ config, derived }) => { + expect(config).toBe('config:override') + expect(derived).toBe('derived:config:override') + }) + }) + }) + + describe('non-auto fixture accessed in file-level beforeEach', () => { + const hookTest = test + .extend('config', () => 'config:default') + .extend('server', ({ config }) => `server:${config}`) + + const hookValues: string[] = [] + + hookTest.beforeEach(({ config }) => { + hookValues.push(config) + }) + + afterEach(() => { + hookValues.length = 0 + }) + + describe('with override', () => { + hookTest.override('config', 'config:override') + + hookTest('beforeEach sees overridden fixture', ({ server }) => { + expect(hookValues).toEqual(['config:override']) + expect(server).toBe('server:config:override') + }) + }) + }) + + describe('nested overrides with file-level beforeEach', () => { + describe('outer', () => { + myTest.override('config', 'config:outer') + + myTest('outer override', ({ config, server }) => { + expect(config).toBe('config:outer') + expect(server).toBe('server:config:outer') + }) + + describe('inner', () => { + myTest.override('config', 'config:inner') + + myTest('inner override wins', ({ config, server }) => { + expect(config).toBe('config:inner') + expect(server).toBe('server:config:inner') + }) + }) + }) + }) }) From 0cd939494c728ca37764fbec740e52348863d7fc Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:11:58 +0900 Subject: [PATCH 04/11] test: split override+beforeEach tests into separate top-level describes Co-Authored-By: Claude Opus 4.6 --- test/core/test/test-extend.test.ts | 125 +++++++++++++++++------------ 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index 1c65e71c6596..1cbb256c5406 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -642,96 +642,115 @@ describe('builder pattern with non-function values', () => { }) // https://github.com/vitest-dev/vitest/issues/9810 -describe('override with beforeEach resolves from test suite', () => { +describe('override auto fixture with outer beforeEach', () => { const myTest = test .extend('config', { auto: true }, () => 'config:default') .extend('server', { auto: true }, ({ config }) => { return `server:${config}` }) - // file-level beforeEach triggers auto fixture resolution beforeEach(({ task }) => { expect(task).toBeTruthy() }) - describe('auto fixture sees overridden dependency', () => { + describe('with override', () => { myTest.override('config', 'config:override') - myTest('override applies to auto fixture', ({ config, server }) => { + myTest('auto fixture sees overridden dependency', ({ config, server }) => { expect(config).toBe('config:override') expect(server).toBe('server:config:override') }) }) +}) - describe('beforeEach inside override describe (already working)', () => { - myTest.override('config', 'config:inner') - - beforeEach(({ task }) => { - expect(task).toBeTruthy() +describe('override auto fixture with co-located beforeEach', () => { + const myTest = test + .extend('config', { auto: true }, () => 'config:default') + .extend('server', { auto: true }, ({ config }) => { + return `server:${config}` }) - myTest('override applies when beforeEach is co-located', ({ config, server }) => { - expect(config).toBe('config:inner') - expect(server).toBe('server:config:inner') - }) + myTest.override('config', 'config:inner') + + beforeEach(({ task }) => { + expect(task).toBeTruthy() }) - describe('non-auto fixture with override and file-level beforeEach', () => { - const manualTest = test - .extend('config', () => 'config:default') - .extend('derived', ({ config }) => `derived:${config}`) + myTest('override applies when beforeEach is co-located', ({ config, server }) => { + expect(config).toBe('config:inner') + expect(server).toBe('server:config:inner') + }) +}) - describe('with override', () => { - manualTest.override('config', 'config:override') +describe('override non-auto fixture with outer beforeEach', () => { + const manualTest = test + .extend('config', () => 'config:default') + .extend('derived', ({ config }) => `derived:${config}`) - manualTest('override applies to non-auto dependency', ({ config, derived }) => { - expect(config).toBe('config:override') - expect(derived).toBe('derived:config:override') - }) + beforeEach(({ task }) => { + expect(task).toBeTruthy() + }) + + describe('with override', () => { + manualTest.override('config', 'config:override') + + manualTest('override applies to non-auto dependency', ({ config, derived }) => { + expect(config).toBe('config:override') + expect(derived).toBe('derived:config:override') }) }) +}) - describe('non-auto fixture accessed in file-level beforeEach', () => { - const hookTest = test - .extend('config', () => 'config:default') - .extend('server', ({ config }) => `server:${config}`) +describe('override fixture accessed in outer beforeEach', () => { + const hookTest = test + .extend('config', () => 'config:default') + .extend('server', ({ config }) => `server:${config}`) - const hookValues: string[] = [] + const hookValues: string[] = [] - hookTest.beforeEach(({ config }) => { - hookValues.push(config) - }) + hookTest.beforeEach(({ config }) => { + hookValues.push(config) + }) - afterEach(() => { - hookValues.length = 0 - }) + afterEach(() => { + hookValues.length = 0 + }) - describe('with override', () => { - hookTest.override('config', 'config:override') + describe('with override', () => { + hookTest.override('config', 'config:override') - hookTest('beforeEach sees overridden fixture', ({ server }) => { - expect(hookValues).toEqual(['config:override']) - expect(server).toBe('server:config:override') - }) + hookTest('beforeEach sees overridden fixture', ({ server }) => { + expect(hookValues).toEqual(['config:override']) + expect(server).toBe('server:config:override') }) }) +}) - describe('nested overrides with file-level beforeEach', () => { - describe('outer', () => { - myTest.override('config', 'config:outer') +describe('nested overrides with outer beforeEach', () => { + const myTest = test + .extend('config', { auto: true }, () => 'config:default') + .extend('server', { auto: true }, ({ config }) => { + return `server:${config}` + }) - myTest('outer override', ({ config, server }) => { - expect(config).toBe('config:outer') - expect(server).toBe('server:config:outer') - }) + beforeEach(({ task }) => { + expect(task).toBeTruthy() + }) + + describe('outer', () => { + myTest.override('config', 'config:outer') + + myTest('outer override', ({ config, server }) => { + expect(config).toBe('config:outer') + expect(server).toBe('server:config:outer') + }) - describe('inner', () => { - myTest.override('config', 'config:inner') + describe('inner', () => { + myTest.override('config', 'config:inner') - myTest('inner override wins', ({ config, server }) => { - expect(config).toBe('config:inner') - expect(server).toBe('server:config:inner') - }) + myTest('inner override wins', ({ config, server }) => { + expect(config).toBe('config:inner') + expect(server).toBe('server:config:inner') }) }) }) From e9c20f5698b57be86bf7e6a5f63c04dac57839a6 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:23:10 +0900 Subject: [PATCH 05/11] test: rename fixtures to base/derived in override tests Co-Authored-By: Claude Opus 4.6 --- test/core/test/test-extend.test.ts | 86 ++++++++++++++---------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index 1cbb256c5406..ff36ae361e31 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -644,9 +644,9 @@ describe('builder pattern with non-function values', () => { // https://github.com/vitest-dev/vitest/issues/9810 describe('override auto fixture with outer beforeEach', () => { const myTest = test - .extend('config', { auto: true }, () => 'config:default') - .extend('server', { auto: true }, ({ config }) => { - return `server:${config}` + .extend('base', { auto: true }, () => 'base:default') + .extend('derived', { auto: true }, ({ base }) => { + return `derived:${base}` }) beforeEach(({ task }) => { @@ -654,83 +654,79 @@ describe('override auto fixture with outer beforeEach', () => { }) describe('with override', () => { - myTest.override('config', 'config:override') + myTest.override('base', 'base:override') - myTest('auto fixture sees overridden dependency', ({ config, server }) => { - expect(config).toBe('config:override') - expect(server).toBe('server:config:override') + myTest('auto fixture sees overridden dependency', ({ base, derived }) => { + expect(base).toBe('base:override') + expect(derived).toBe('derived:base:override') }) }) }) describe('override auto fixture with co-located beforeEach', () => { const myTest = test - .extend('config', { auto: true }, () => 'config:default') - .extend('server', { auto: true }, ({ config }) => { - return `server:${config}` + .extend('base', { auto: true }, () => 'base:default') + .extend('derived', { auto: true }, ({ base }) => { + return `derived:${base}` }) - myTest.override('config', 'config:inner') + myTest.override('base', 'base:override') beforeEach(({ task }) => { expect(task).toBeTruthy() }) - myTest('override applies when beforeEach is co-located', ({ config, server }) => { - expect(config).toBe('config:inner') - expect(server).toBe('server:config:inner') + myTest('override applies when beforeEach is co-located', ({ base, derived }) => { + expect(base).toBe('base:override') + expect(derived).toBe('derived:base:override') }) }) describe('override non-auto fixture with outer beforeEach', () => { - const manualTest = test - .extend('config', () => 'config:default') - .extend('derived', ({ config }) => `derived:${config}`) + const myTest = test + .extend('base', () => 'base:default') + .extend('derived', ({ base }) => `derived:${base}`) beforeEach(({ task }) => { expect(task).toBeTruthy() }) describe('with override', () => { - manualTest.override('config', 'config:override') + myTest.override('base', 'base:override') - manualTest('override applies to non-auto dependency', ({ config, derived }) => { - expect(config).toBe('config:override') - expect(derived).toBe('derived:config:override') + myTest('override applies to non-auto dependency', ({ base, derived }) => { + expect(base).toBe('base:override') + expect(derived).toBe('derived:base:override') }) }) }) describe('override fixture accessed in outer beforeEach', () => { - const hookTest = test - .extend('config', () => 'config:default') - .extend('server', ({ config }) => `server:${config}`) + const myTest = test + .extend('base', () => 'base:default') + .extend('derived', ({ base }) => `derived:${base}`) const hookValues: string[] = [] - hookTest.beforeEach(({ config }) => { - hookValues.push(config) - }) - - afterEach(() => { - hookValues.length = 0 + myTest.beforeEach(({ base }) => { + hookValues.push(base) }) describe('with override', () => { - hookTest.override('config', 'config:override') + myTest.override('base', 'base:override') - hookTest('beforeEach sees overridden fixture', ({ server }) => { - expect(hookValues).toEqual(['config:override']) - expect(server).toBe('server:config:override') + myTest('beforeEach sees overridden fixture', ({ derived }) => { + expect(hookValues).toEqual(['base:override']) + expect(derived).toBe('derived:base:override') }) }) }) describe('nested overrides with outer beforeEach', () => { const myTest = test - .extend('config', { auto: true }, () => 'config:default') - .extend('server', { auto: true }, ({ config }) => { - return `server:${config}` + .extend('base', { auto: true }, () => 'base:default') + .extend('derived', { auto: true }, ({ base }) => { + return `derived:${base}` }) beforeEach(({ task }) => { @@ -738,19 +734,19 @@ describe('nested overrides with outer beforeEach', () => { }) describe('outer', () => { - myTest.override('config', 'config:outer') + myTest.override('base', 'base:outer') - myTest('outer override', ({ config, server }) => { - expect(config).toBe('config:outer') - expect(server).toBe('server:config:outer') + myTest('outer override', ({ base, derived }) => { + expect(base).toBe('base:outer') + expect(derived).toBe('derived:base:outer') }) describe('inner', () => { - myTest.override('config', 'config:inner') + myTest.override('base', 'base:inner') - myTest('inner override wins', ({ config, server }) => { - expect(config).toBe('config:inner') - expect(server).toBe('server:config:inner') + myTest('inner override wins', ({ base, derived }) => { + expect(base).toBe('base:inner') + expect(derived).toBe('derived:base:inner') }) }) }) From 0e2175d2efac28b3243b3b2c053cddad19bec6a7 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:29:31 +0900 Subject: [PATCH 06/11] test: add aroundEach override test case aroundEach was also affected since withFixtures is called at runtime when getCurrentSuite() returns the default file-level suite. Co-Authored-By: Claude Opus 4.6 --- test/core/test/test-extend.test.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index ff36ae361e31..4cdc453a76af 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -751,3 +751,25 @@ describe('nested overrides with outer beforeEach', () => { }) }) }) + +describe('override fixture accessed in aroundEach', () => { + const myTest = test + .extend('base', () => 'base:default') + .extend('derived', ({ base }) => `derived:${base}`) + + const hookValues: string[] = [] + + myTest.aroundEach(async (runTest, { base }) => { + hookValues.push(base) + await runTest() + }) + + describe('with override', () => { + myTest.override('base', 'base:override') + + myTest('aroundEach sees overridden fixture', ({ derived }) => { + expect(hookValues).toEqual(['base:override']) + expect(derived).toBe('derived:base:override') + }) + }) +}) From 10079df5940030f4c84d6b28cc601a5c09266590 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:30:34 +0900 Subject: [PATCH 07/11] chore: adjust comment to clarify xxxEach scope Co-Authored-By: Claude Opus 4.6 --- packages/runner/src/fixture.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 38f6e0a207ae..766d2c159784 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -314,8 +314,8 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { return fn(context) } - // Use the test's parent suite when available so that beforeEach/afterEach - // hooks pick up fixture overrides registered in the test's describe block + // For xxxEach hooks, use the test's parent suite to pick up fixture + // overrides registered in the test's describe block (#9810) const suite = context.task?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { From b1c6ce11390f8ab517e4a98a4cb9c95f0b9c6828 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 9 Mar 2026 12:33:29 +0900 Subject: [PATCH 08/11] test: adjust comment --- packages/runner/src/fixture.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 766d2c159784..4f021cfec86c 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -314,8 +314,10 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { return fn(context) } - // For xxxEach hooks, use the test's parent suite to pick up fixture - // overrides registered in the test's describe block (#9810) + // For `xxxEach` hooks, use the test's parent suite to pick up fixture + // overrides registered in the test's describe block. + // For `test`, `collectorSuite` is already same as `context.task.suite`. + // For `xxxAll` hooks, there's no `context.task`. const suite = context.task?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { From 00a4144ca3c90db92d2669b3d2e540c7f87b530c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 10 Mar 2026 11:11:21 +0900 Subject: [PATCH 09/11] refactor: caller passes suite to withFixtures --- packages/runner/src/fixture.ts | 11 ++++++----- packages/runner/src/hooks.ts | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 4f021cfec86c..46167505da9e 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -291,6 +291,11 @@ export interface WithFixturesOptions { * Current fixtures from the context. */ fixtures?: TestFixtures + /** + * The suite to use for fixture lookups. + * Used by beforeEach/afterEach/aroundEach hooks to pick up fixture overrides from the test's describe block. + */ + suite?: Suite } const contextHasFixturesCache = new WeakMap>() @@ -314,11 +319,7 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { return fn(context) } - // For `xxxEach` hooks, use the test's parent suite to pick up fixture - // overrides registered in the test's describe block. - // For `test`, `collectorSuite` is already same as `context.task.suite`. - // For `xxxAll` hooks, there's no `context.task`. - const suite = context.task?.suite ?? collectorSuite + const suite = options?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { return fn(context) diff --git a/packages/runner/src/hooks.ts b/packages/runner/src/hooks.ts index 9e3d122b3537..a8b800cb61f3 100644 --- a/packages/runner/src/hooks.ts +++ b/packages/runner/src/hooks.ts @@ -157,11 +157,17 @@ export function beforeEach( ): void { assertTypes(fn, '"beforeEach" callback', ['function']) const stackTraceError = new Error('STACK_TRACE_ERROR') + + const wrapper: BeforeEachListener = (context, suite) => { + const fixtureResolver = withFixtures(fn, { suite }) + return fixtureResolver(context) + } + return getCurrentSuite().on( 'beforeEach', Object.assign( withTimeout( - withFixtures(fn), + wrapper, timeout ?? getDefaultHookTimeout(), true, stackTraceError, @@ -197,10 +203,15 @@ export function afterEach( timeout?: number, ): void { assertTypes(fn, '"afterEach" callback', ['function']) + const wrapper: AfterEachListener = (context, suite) => { + const fixtureResolver = withFixtures(fn, { suite }) + return fixtureResolver(context) + } + return getCurrentSuite().on( 'afterEach', withTimeout( - withFixtures(fn), + wrapper, timeout ?? getDefaultHookTimeout(), true, new Error('STACK_TRACE_ERROR'), @@ -375,7 +386,7 @@ export function aroundEach( const innerFn = (ctx: any) => fn(runTest, ctx, suite) configureProps(innerFn, { index: 1, original: fn }) - const fixtureResolver = withFixtures(innerFn) + const fixtureResolver = withFixtures(innerFn, { suite }) return fixtureResolver(context) } From ecc04282461da4412081dddba12277bf0e7707c3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 10 Mar 2026 11:20:56 +0900 Subject: [PATCH 10/11] chore: fix types --- packages/runner/src/context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runner/src/context.ts b/packages/runner/src/context.ts index f793b03c6901..00dea0a9b3a0 100644 --- a/packages/runner/src/context.ts +++ b/packages/runner/src/context.ts @@ -136,7 +136,7 @@ export function withCancel any>( const abortControllers = new WeakMap() -export function abortIfTimeout([context]: [TestContext?], error: Error): void { +export function abortIfTimeout([context]: [TestContext?, unknown?], error: Error): void { if (context) { abortContextSignal(context, error) } From 6d7ba29d762d43e9a1bb3aa230aaf5433f83a699 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 10 Mar 2026 11:22:07 +0900 Subject: [PATCH 11/11] refactor: move code --- packages/runner/src/fixture.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 46167505da9e..002bb7bc6063 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -302,7 +302,7 @@ const contextHasFixturesCache = new WeakMap => { const context: (TestContext & { [key: string]: any }) | undefined = hookContext || options?.context as TestContext @@ -319,7 +319,6 @@ export function withFixtures(fn: Function, options?: WithFixturesOptions) { return fn(context) } - const suite = options?.suite ?? collectorSuite const registrations = fixtures.get(suite) if (!registrations.size) { return fn(context)