11import path from 'node:path'
22import { rm } from 'node:fs/promises'
3- import { stripVTControlCharacters } from 'node:util'
3+ import { inspect , stripVTControlCharacters } from 'node:util'
44import * as vscode from 'vscode'
55import { getTasks } from '@vitest/runner/utils'
66import 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+
594652export interface DebuggerLocation {
595653 path : string
596654 line : number
0 commit comments