vitest-dev/vitest · error · Error

Mock ${id} wasn't resolved. This is probably a Vitest error.

Error message

Mock ${id} wasn't resolved. This is probably a Vitest error. Please, open a new issue with reproduction.

What it means

Thrown by getFactoryModule at packages/mocker/src/browser/mocker.ts:45-47 when a manual mock entry exists in the registry but its cache is falsy, meaning the module was registered but never resolved. Manual mocks must be resolved (via ManualMockedModule.resolve()) before their factory exports can be read.

Source

Thrown at packages/mocker/src/browser/mocker.ts:46

    await Promise.all([...this.queue.values()])
  }

  public async resolveFactoryModule(id: string): Promise<Record<string | symbol, any>> {
    const mock = this.registry.get(id)
    if (!mock || mock.type !== 'manual') {
      throw new Error(`Mock ${id} wasn't registered. This is probably a Vitest error. Please, open a new issue with reproduction.`)
    }
    const result = await mock.resolve()
    return result
  }

  public getFactoryModule(id: string): any {
    const mock = this.registry.get(id)
    if (!mock || mock.type !== 'manual') {
      throw new Error(`Mock ${id} wasn't registered. This is probably a Vitest error. Please, open a new issue with reproduction.`)
    }
    if (!mock.cache) {
      throw new Error(`Mock ${id} wasn't resolved. This is probably a Vitest error. Please, open a new issue with reproduction.`)
    }
    return mock.cache
  }

  public async invalidate(): Promise<void> {
    const ids = Array.from(this.mockedIds)
    if (!ids.length) {
      return
    }
    await this.rpc.invalidate(ids)
    await this.interceptor.invalidate()
    this.registry.clear()
  }

  public async importActual<T>(id: string, importer: string): Promise<T> {
    const resolved = await this.rpc.resolveId(id, importer)
    if (resolved == null) {
      throw new Error(

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Ensure resolveFactoryModule(id) is awaited before getFactoryModule(id).
  2. Avoid clearing the registry between resolve and read.
  3. Report with a reproduction as this is a Vitest-internal lifecycle error.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  vi.mock('./x', factory)
} catch (e) {
  if (e instanceof Error && /wasn't resolved/.test(e.message)) {
    console.error('Vitest internal: manual mock registered but not resolved. Report with reproduction.')
  }
  throw e
}

Prevention

When it happens

Trigger: getFactoryModule(id) called before resolveFactoryModule(id) (which triggers resolve() and populates cache) was awaited for that id.

Common situations: Internal ordering where the read precedes the resolve; a failed resolve() that left cache unset; reset between resolve and read.

Related errors


AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03). Data as JSON: /data/errors/49b82d5a3225ab55.json. Report an issue: GitHub.