Skip to content

Commit e1333aa

Browse files
committed
fix: print error properties if there are any custom ones
Closes #602
1 parent cb05b04 commit e1333aa

File tree

1 file changed

+61
-3
lines changed

1 file changed

+61
-3
lines changed

src/runner.ts

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from 'node:path'
22
import { rm } from 'node:fs/promises'
3-
import { stripVTControlCharacters } from 'node:util'
3+
import { inspect, stripVTControlCharacters } from 'node:util'
44
import * as vscode from 'vscode'
55
import { getTasks } from '@vitest/runner/utils'
66
import type { ParsedStack, TaskResult, TestError } from 'vitest'
@@ -577,9 +577,9 @@ function testMessageForTestError(testItem: vscode.TestItem, error: TestError | u
577577

578578
let testMessage
579579
if (error.actual != null && error.expected != null && error.actual !== 'undefined' && error.expected !== 'undefined')
580-
testMessage = vscode.TestMessage.diff(stripVTControlCharacters(error.message) ?? '', error.expected, error.actual)
580+
testMessage = vscode.TestMessage.diff(getErrorMessage(error), error.expected, error.actual)
581581
else
582-
testMessage = new vscode.TestMessage(stripVTControlCharacters(error.message) ?? '')
582+
testMessage = new vscode.TestMessage(getErrorMessage(error))
583583

584584
setMessageStackFramesFromErrorStacks(testMessage, error.stacks)
585585

@@ -591,6 +591,64 @@ function testMessageForTestError(testItem: vscode.TestItem, error: TestError | u
591591
return testMessage
592592
}
593593

594+
function getErrorMessage(error: TestError) {
595+
let message = stripVTControlCharacters(error.message ?? '')
596+
if (typeof error.frame === 'string') {
597+
message += `\n${error.frame}`
598+
}
599+
else {
600+
const errorProperties = getErrorProperties(error)
601+
if (Object.keys(errorProperties).length) {
602+
const errorsInspect = inspect(errorProperties, {
603+
showHidden: false,
604+
colors: false,
605+
})
606+
message += `\nSerialized Error: ${errorsInspect.slice('[Object: null prototype] '.length)}`
607+
}
608+
}
609+
return message
610+
}
611+
612+
const skipErrorProperties = new Set([
613+
'nameStr',
614+
'stack',
615+
'cause',
616+
'stacks',
617+
'stackStr',
618+
'type',
619+
'showDiff',
620+
'ok',
621+
'operator',
622+
'diff',
623+
'codeFrame',
624+
'actual',
625+
'expected',
626+
'diffOptions',
627+
'sourceURL',
628+
'column',
629+
'line',
630+
'VITEST_TEST_NAME',
631+
'VITEST_TEST_PATH',
632+
'VITEST_AFTER_ENV_TEARDOWN',
633+
...Object.getOwnPropertyNames(Error.prototype),
634+
...Object.getOwnPropertyNames(Object.prototype),
635+
])
636+
637+
function getErrorProperties(e: TestError) {
638+
const errorObject = Object.create(null)
639+
if (e.name === 'AssertionError') {
640+
return errorObject
641+
}
642+
643+
for (const key of Object.getOwnPropertyNames(e)) {
644+
if (!skipErrorProperties.has(key)) {
645+
errorObject[key] = e[key as keyof TestError]
646+
}
647+
}
648+
649+
return errorObject
650+
}
651+
594652
export interface DebuggerLocation {
595653
path: string
596654
line: number

0 commit comments

Comments
 (0)