Skip to content

Commit

Permalink
fix(vitest): throw "cannot mock" error only in isolated pools (#4905)
Browse files Browse the repository at this point in the history
  • Loading branch information
sheremet-va authored Jan 9, 2024
1 parent e9fe418 commit f99cc31
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 5 deletions.
2 changes: 1 addition & 1 deletion packages/utils/src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export function serializeError(val: any, seen = new WeakMap()): any {
}

function normalizeErrorMessage(message: string) {
return message.replace(/__vite_ssr_import_\d+__\./g, '')
return message.replace(/__(vite_ssr_import|vi_import)_\d+__\./g, '')
}

export function processError(err: any, diffOptions?: DiffOptions) {
Expand Down
2 changes: 1 addition & 1 deletion packages/vitest/src/runtime/execute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ export class VitestExecutor extends ViteNodeRunner {
return this.primitives
}

get state() {
get state(): WorkerGlobalState {
// @ts-expect-error injected untyped global
return globalThis.__vitest_worker__ || this.options.state
}
Expand Down
14 changes: 11 additions & 3 deletions packages/vitest/src/runtime/mocker.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { existsSync, readdirSync } from 'node:fs'
import vm from 'node:vm'
import { basename, dirname, extname, isAbsolute, join, resolve } from 'pathe'
import { basename, dirname, extname, isAbsolute, join, relative, resolve } from 'pathe'
import { getColors, getType } from '@vitest/utils'
import { isNodeBuiltin } from 'vite-node/utils'
import { distDir } from '../paths'
Expand Down Expand Up @@ -410,8 +410,16 @@ export class VitestMocker {
public mockPath(originalId: string, path: string, external: string | null, factory: MockFactory | undefined, throwIfExists: boolean) {
const id = this.normalizePath(path)

if (throwIfExists && this.moduleCache.has(id))
throw new Error(`[vitest] Cannot mock "${originalId}" because it is already loaded. Did you import it in a setup file?\n\nPlease, remove the import if you want static imports to be mocked, or clear module cache by calling "vi.resetModules()" before mocking if you are going to import the file again. See: https://vitest.dev/guide/common-errors.html#cannot-mock-mocked-file.js-because-it-is-already-loaded`)
const { config } = this.executor.state
const isIsolatedThreads = config.pool === 'threads' && (config.poolOptions?.threads?.isolate ?? true)
const isIsolatedForks = config.pool === 'forks' && (config.poolOptions?.forks?.isolate ?? true)

// TODO: find a good way to throw this error even in non-isolated mode
if (throwIfExists && (isIsolatedThreads || isIsolatedForks)) {
const cached = this.moduleCache.has(id) && this.moduleCache.getByModuleId(id)
if (cached && cached.importers.size)
throw new Error(`[vitest] Cannot mock "${originalId}" because it is already loaded by "${[...cached.importers.values()].map(i => relative(this.root, i)).join('", "')}".\n\nPlease, remove the import if you want static imports to be mocked, or clear module cache by calling "vi.resetModules()" before mocking if you are going to import the file again. See: https://vitest.dev/guide/common-errors.html#cannot-mock-mocked-file-js-because-it-is-already-loaded`)
}

const suitefile = this.getSuiteFilepath()
const mocks = this.mockMap.get(suitefile) || {}
Expand Down

0 comments on commit f99cc31

Please sign in to comment.