diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index 9383ee21eea3..4c12f14e947f 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -145,10 +145,8 @@ export class Vitest { return coreWorkspace } - public getCoreWorkspaceProject() { - if (!this.coreWorkspace) - throw new Error('Core workspace project is not initialized') - return this.coreWorkspace + public getCoreWorkspaceProject(): WorkspaceProject | null { + return this.coreWorkspace || null } private async resolveWorkspace(options: UserConfig, cliOptions: UserConfig) { @@ -687,10 +685,13 @@ export class Vitest { async close() { if (!this.closingPromise) { + const closePromises = this.projects.map(w => w.close()) + // close the core workspace server only once + if (this.coreWorkspace && !this.projects.includes(this.coreWorkspace)) + closePromises.push(this.server.close()) this.closingPromise = Promise.allSettled([ this.pool?.close(), - this.server.close(), - ...this.projects.map(w => w.close()), + ...closePromises, ].filter(Boolean)).then((results) => { results.filter(r => r.status === 'rejected').forEach((err) => { this.logger.error('error during close', (err as PromiseRejectedResult).reason) diff --git a/test/global-setup/globalSetup/another-vite-instance.ts b/test/global-setup/globalSetup/another-vite-instance.ts index 74522166f0b1..e533e6e76fc4 100644 --- a/test/global-setup/globalSetup/another-vite-instance.ts +++ b/test/global-setup/globalSetup/another-vite-instance.ts @@ -1,6 +1,8 @@ import { createServer } from 'vite' import { resolve } from 'pathe' +let teardownHappened = false + export async function setup() { const server = await createServer({ root: resolve(__dirname, '..'), @@ -11,6 +13,9 @@ export async function setup() { await server.listen(9988) return async () => { + if (teardownHappened) + throw new Error('teardown called twice') + teardownHappened = true await server.close() } } diff --git a/test/global-setup/globalSetup/default-export.js b/test/global-setup/globalSetup/default-export.js index 225646c9a0b4..9d670a5153a3 100644 --- a/test/global-setup/globalSetup/default-export.js +++ b/test/global-setup/globalSetup/default-export.js @@ -2,6 +2,8 @@ async function sleep(n) { return new Promise(resolve => setTimeout(resolve, n)) } +let teardownHappened = false + export default async function () { // setup something eg start a server, db or whatever // const server = await start() @@ -10,6 +12,9 @@ export default async function () { await sleep(25) return async () => { + if (teardownHappened) + throw new Error('teardown called twice') + teardownHappened = true // tear it down here // await server.close() await sleep(25) diff --git a/test/global-setup/globalSetup/named-exports.js b/test/global-setup/globalSetup/named-exports.js index 51cb771afc35..aa25a731026c 100644 --- a/test/global-setup/globalSetup/named-exports.js +++ b/test/global-setup/globalSetup/named-exports.js @@ -2,6 +2,8 @@ async function sleep(n) { return new Promise(resolve => setTimeout(resolve, n)) } +let teardownHappened = false + // let start export async function setup() { @@ -13,6 +15,9 @@ export async function setup() { } export async function teardown() { + if (teardownHappened) + throw new Error('teardown called twice') + teardownHappened = true // tear it down here // await server.close() await sleep(25) diff --git a/test/global-setup/globalSetup/ts-with-imports.ts b/test/global-setup/globalSetup/ts-with-imports.ts index e1ac09dfd6ba..860ab957a475 100644 --- a/test/global-setup/globalSetup/ts-with-imports.ts +++ b/test/global-setup/globalSetup/ts-with-imports.ts @@ -1,6 +1,13 @@ import { startServer } from './server' +let teardown = false + export default async function () { const server = await startServer('0.0.0.0', 9876) - return async () => new Promise(resolve => server.close(() => resolve())) + return async () => { + if (teardown) + throw new Error('teardown called twice') + teardown = true + return new Promise(resolve => server.close(() => resolve())) + } }