diff --git a/packages/vitest/src/node/reporters/tap.ts b/packages/vitest/src/node/reporters/tap.ts index 0800d9ad5c14..53096f523d14 100644 --- a/packages/vitest/src/node/reporters/tap.ts +++ b/packages/vitest/src/node/reporters/tap.ts @@ -1,5 +1,5 @@ import type { Task } from '@vitest/runner' -import type { ParsedStack } from '@vitest/utils' +import type { ErrorWithDiff, ParsedStack } from '@vitest/utils' import type { Vitest } from '../../node' import type { Reporter } from '../../types/reporter' import { parseErrorStacktrace } from '../../utils/source-map' @@ -36,9 +36,10 @@ export class TapReporter implements Reporter { return '' } - private logErrorDetails(error: Error, stack?: ParsedStack) { - this.logger.log(`name: ${yamlString(error.name)}`) - this.logger.log(`message: ${yamlString(error.message)}`) + private logErrorDetails(error: ErrorWithDiff, stack?: ParsedStack) { + const errorName = error.name || error.nameStr || 'Unknown Error' + this.logger.log(`name: ${yamlString(String(errorName))}`) + this.logger.log(`message: ${yamlString(String(error.message))}`) if (stack) { // For compatibility with tap-mocha-reporter diff --git a/test/reporters/fixtures/custom-error/basic.test.ts b/test/reporters/fixtures/custom-error/basic.test.ts new file mode 100644 index 000000000000..41220e57f830 --- /dev/null +++ b/test/reporters/fixtures/custom-error/basic.test.ts @@ -0,0 +1,17 @@ +import { test } from 'vitest'; + +test('no name object', () => { + throw { noName: 'hi' }; +}); + +test('string', () => { + throw "hi"; +}); + +test('number', () => { + throw 1234; +}); + +test('number name object', () => { + throw { name: 1234 }; +}); diff --git a/test/reporters/fixtures/custom-error/vitest.config.ts b/test/reporters/fixtures/custom-error/vitest.config.ts new file mode 100644 index 000000000000..abed6b2116e1 --- /dev/null +++ b/test/reporters/fixtures/custom-error/vitest.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({}) diff --git a/test/reporters/tests/tap.test.ts b/test/reporters/tests/tap.test.ts new file mode 100644 index 000000000000..51cdf518ca16 --- /dev/null +++ b/test/reporters/tests/tap.test.ts @@ -0,0 +1,37 @@ +import { expect, test } from 'vitest' +import { runVitest } from '../../test-utils' + +test('handle custom error without name', async () => { + let { stdout, stderr } = await runVitest({ reporters: 'tap-flat', root: './fixtures/custom-error' }) + stdout = stdout.replaceAll(/time=(\S*)/g, 'time=[...]') // strip non-deterministic output + expect(stdout).toMatchInlineSnapshot(` + "TAP version 13 + 1..4 + not ok 1 - basic.test.ts > no name object # time=[...] + --- + error: + name: "Unknown Error" + message: "undefined" + ... + not ok 2 - basic.test.ts > string # time=[...] + --- + error: + name: "Unknown Error" + message: "hi" + ... + not ok 3 - basic.test.ts > number # time=[...] + --- + error: + name: "Unknown Error" + message: "1234" + ... + not ok 4 - basic.test.ts > number name object # time=[...] + --- + error: + name: "1234" + message: "undefined" + ... + " + `) + expect(stderr).toBe('') +})