diff --git a/test/cli/fixtures/stacktraces-custom-helper/basic.test.ts b/test/cli/fixtures/stacktraces-custom-helper/basic.test.ts new file mode 100644 index 000000000..53de1f210 --- /dev/null +++ b/test/cli/fixtures/stacktraces-custom-helper/basic.test.ts @@ -0,0 +1,14 @@ +import { test } from "vitest"; +import { assertHelper, assertHelperAsync, assertHelperBad } from "./helper.js"; + +test("sync", async () => { + assertHelper(3, 4); +}); + +test("async", async () => { + await assertHelperAsync(3, 4) +}) + +test("bad", () => { + assertHelperBad(3, 4) +}) diff --git a/test/cli/fixtures/stacktraces-custom-helper/helper.ts b/test/cli/fixtures/stacktraces-custom-helper/helper.ts new file mode 100644 index 000000000..91cabc58b --- /dev/null +++ b/test/cli/fixtures/stacktraces-custom-helper/helper.ts @@ -0,0 +1,24 @@ +import { expect } from "vitest"; + +export function assertHelper(expected: any, actual: any) { + try { + expect(expected).toBe(actual); + } catch (error: any) { + Error.captureStackTrace(error, assertHelper); + throw error; + } +} + +export async function assertHelperAsync(expected: any, actual: any) { + try { + await Promise.resolve(); + expect(expected).toBe(actual); + } catch (error: any) { + Error.captureStackTrace(error, assertHelperAsync); + throw error; + } +} + +export function assertHelperBad(expected: any, actual: any) { + expect(expected).toBe(actual); +} diff --git a/test/cli/test/stacktraces.test.ts b/test/cli/test/stacktraces.test.ts index 2ec746ebd..2555e0813 100644 --- a/test/cli/test/stacktraces.test.ts +++ b/test/cli/test/stacktraces.test.ts @@ -108,3 +108,88 @@ function removeLines(log: string) { function removeNodeModules(log: string) { return log.replace(/[^ ]*\/node_modules\//g, '(NODE_MODULES)/') } + +it('custom helper with captureStackTrace', async () => { + const { stderr, errorTree } = await runVitest({ + root: resolve(import.meta.dirname, '../fixtures/stacktraces-custom-helper'), + }) + expect(stderr).toMatchInlineSnapshot(` + " + ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 3 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL basic.test.ts > sync + AssertionError: expected 3 to be 4 // Object.is equality + + - Expected + + Received + + - 4 + + 3 + + ❯ basic.test.ts:5:3 + 3| + 4| test("sync", async () => { + 5| assertHelper(3, 4); + | ^ + 6| }); + 7| + + ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/3]⎯ + + FAIL basic.test.ts > async + AssertionError: expected 3 to be 4 // Object.is equality + + - Expected + + Received + + - 4 + + 3 + + ❯ basic.test.ts:9:3 + 7| + 8| test("async", async () => { + 9| await assertHelperAsync(3, 4) + | ^ + 10| }) + 11| + + ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/3]⎯ + + FAIL basic.test.ts > bad + AssertionError: expected 3 to be 4 // Object.is equality + + - Expected + + Received + + - 4 + + 3 + + ❯ assertHelperBad helper.ts:23:20 + 21| + 22| export function assertHelperBad(expected: any, actual: any) { + 23| expect(expected).toBe(actual); + | ^ + 24| } + 25| + ❯ basic.test.ts:13:3 + + ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/3]⎯ + + " + `) + expect(errorTree()).toMatchInlineSnapshot(` + { + "basic.test.ts": { + "async": [ + "expected 3 to be 4 // Object.is equality", + ], + "bad": [ + "expected 3 to be 4 // Object.is equality", + ], + "sync": [ + "expected 3 to be 4 // Object.is equality", + ], + }, + } + `) +})