diff --git a/packages/vitest/src/node/error.ts b/packages/vitest/src/node/error.ts index aea8b0c4dd5b..5ab9ff874b97 100644 --- a/packages/vitest/src/node/error.ts +++ b/packages/vitest/src/node/error.ts @@ -91,8 +91,6 @@ function printErrorType(type: string, ctx: Vitest) { } const skipErrorProperties = [ - 'message', - 'name', 'nameStr', 'stack', 'cause', @@ -102,8 +100,8 @@ const skipErrorProperties = [ 'showDiff', 'actual', 'expected', - 'constructor', - 'toString', + ...Object.getOwnPropertyNames(Error.prototype), + ...Object.getOwnPropertyNames(Object.prototype), ] function getErrorProperties(e: ErrorWithDiff) { diff --git a/packages/vitest/src/runtime/error.ts b/packages/vitest/src/runtime/error.ts index 353096c3a917..ca4e4cb26543 100644 --- a/packages/vitest/src/runtime/error.ts +++ b/packages/vitest/src/runtime/error.ts @@ -53,10 +53,10 @@ export function serializeError(val: any, seen = new WeakMap()): any { let obj = val while (obj && obj !== OBJECT_PROTO) { Object.getOwnPropertyNames(obj).forEach((key) => { - if ((key in clone)) + if (key in clone) return try { - clone[key] = serializeError(obj[key], seen) + clone[key] = serializeError(val[key], seen) } catch (err) { // delete in case it has a setter from prototype that might throw diff --git a/packages/vitest/src/runtime/worker.ts b/packages/vitest/src/runtime/worker.ts index 69f7dd6bf7b5..0428c26dae02 100644 --- a/packages/vitest/src/runtime/worker.ts +++ b/packages/vitest/src/runtime/worker.ts @@ -8,6 +8,7 @@ import { getWorkerState } from '../utils' import type { MockMap } from '../types/mocker' import { executeInViteNode } from './execute' import { rpc } from './rpc' +import { processError } from './error' let _viteNode: { run: (files: string[], config: ResolvedConfig) => Promise @@ -32,7 +33,7 @@ async function startViteNode(ctx: WorkerContext) { } process.on('unhandledRejection', (err) => { - rpc().onUnhandledRejection(err) + rpc().onUnhandledRejection(processError(err)) }) const { config } = ctx diff --git a/test/core/test/serialize.test.ts b/test/core/test/serialize.test.ts index 96b5300e67d1..b4e79c4dfbe3 100644 --- a/test/core/test/serialize.test.ts +++ b/test/core/test/serialize.test.ts @@ -1,3 +1,5 @@ +// @vitest-environment jsdom + import { describe, expect, it } from 'vitest' import { serializeError } from '../../../packages/vitest/src/runtime/error' @@ -125,4 +127,14 @@ describe('error serialize', () => { unserializable: ': I am unserializable', }) }) + + it('can serialize DOMException', () => { + const err = new DOMException('You failed', 'InvalidStateError') + expect(serializeError(err)).toMatchObject({ + NETWORK_ERR: 19, + name: 'InvalidStateError', + message: 'You failed', + stack: expect.stringContaining('InvalidStateError: You failed'), + }) + }) })