[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.

fix(browser): ensure setup files are re-evaluated on each test run (fixes #8883) (#8884)

authored by

Younes Jaaidi and committed by
GitHub
(Oct 31, 2025, 12:42 PM +0100) f50ea7a2 31706dfe

+57 -1
+3 -1
packages/browser/src/client/tester/runner.ts
··· 257 257 258 258 importFile = async (filepath: string, mode: 'collect' | 'setup') => { 259 259 let hash = this.hashMap.get(filepath) 260 - if (!hash) { 260 + 261 + // if the mode is setup, we need to re-evaluate the setup file on each test run 262 + if (mode === 'setup' || !hash) { 261 263 hash = Date.now().toString() 262 264 this.hashMap.set(filepath, hash) 263 265 }
+7
test/browser/fixtures/isolate-and-setup-file/a.test.ts
··· 1 + import { expect, test } from 'vitest' 2 + import { counter } from './counter' 3 + 4 + test('increment counter', () => { 5 + counter.increment() 6 + expect(counter.get()).toBe(1) 7 + });
+7
test/browser/fixtures/isolate-and-setup-file/b.test.ts
··· 1 + import { expect, test } from 'vitest' 2 + import { counter } from './counter' 3 + 4 + test('make sure the counter is reset by the setup file beforeEach hook', () => { 5 + counter.increment() 6 + expect(counter.get()).toBe(1) 7 + });
+4
test/browser/fixtures/isolate-and-setup-file/browser-setup.ts
··· 1 + import { beforeEach } from 'vitest' 2 + import { counter } from './counter' 3 + 4 + beforeEach(() => counter.reset())
+6
test/browser/fixtures/isolate-and-setup-file/counter.ts
··· 1 + const g = globalThis as unknown as { counter: number }; 2 + export const counter = { 3 + get: () => g.counter, 4 + increment: () => g.counter++, 5 + reset: () => (g.counter = 0), 6 + };
+17
test/browser/fixtures/isolate-and-setup-file/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url' 2 + import { defineConfig } from 'vitest/config' 3 + import { instances, provider } from '../../settings' 4 + 5 + export default defineConfig({ 6 + cacheDir: fileURLToPath(new URL("./node_modules/.vite", import.meta.url)), 7 + test: { 8 + setupFiles: ['./browser-setup.ts'], 9 + browser: { 10 + enabled: true, 11 + isolate: false, 12 + provider, 13 + instances, 14 + headless: false, 15 + }, 16 + }, 17 + })
+13
test/browser/specs/runner.test.ts
··· 290 290 expect(stdout).toContain(`Tests ${instances.length} passed`) 291 291 }) 292 292 293 + test('re-evaluate setupFiles on each test run even when isolate is false', async () => { 294 + const { exitCode, stderr, stdout } = await runBrowserTests({ 295 + root: './fixtures/isolate-and-setup-file', 296 + }) 297 + 298 + expect(stderr).toBe('') 299 + expect(exitCode).toBe(0) 300 + instances.forEach(({ browser }) => { 301 + expect(stdout).toReportPassedTest('a.test.ts', browser) 302 + expect(stdout).toReportPassedTest('b.test.ts', browser) 303 + }) 304 + }) 305 + 293 306 test.runIf(provider.name === 'playwright')('timeout hooks', async ({ onTestFailed }) => { 294 307 const { stderr } = await runBrowserTests({ 295 308 root: './fixtures/timeout-hooks',