Skip to content

Commit 3e19f27

Browse files
authored
fix: don't merge errors with different diffs for reporting (#8871)
1 parent ed9fc71 commit 3e19f27

File tree

4 files changed

+146
-1
lines changed

4 files changed

+146
-1
lines changed

packages/vitest/src/node/reporters/base.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,7 @@ export abstract class BaseReporter implements Reporter {
617617
const failedTests = tests.filter(i => i.result?.state === 'fail')
618618
const failedTotal = countTestErrors(failedSuites) + countTestErrors(failedTests)
619619

620+
// TODO: error divider should take into account merged errors for counting
620621
let current = 1
621622
const errorDivider = () => this.error(`${c.red(c.dim(divider(`[${current++}/${failedTotal}]`, undefined, 1)))}\n`)
622623

@@ -677,7 +678,7 @@ export abstract class BaseReporter implements Reporter {
677678

678679
if (error?.stack) {
679680
previous = errorsQueue.find((i) => {
680-
if (i[0]?.stack !== error.stack) {
681+
if (i[0]?.stack !== error.stack || i[0]?.diff !== error.diff) {
681682
return false
682683
}
683684

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { expect, test } from "vitest";
2+
3+
// not merged
4+
test.for([1, 2])("test-a %$", (n) => {
5+
expect(n).toBe(0);
6+
});
7+
8+
// merged
9+
test.for([1, 2])("test-b %$", (n) => {
10+
expect(1).toBe(0);
11+
});
12+
13+
// not merged
14+
test.each([
15+
{
16+
actual: ["a".repeat(50)],
17+
expected: ["b".repeat(50)],
18+
},
19+
{
20+
actual: ["c".repeat(50)],
21+
expected: ["d".repeat(50)],
22+
},
23+
])("test-c %$", async ({ actual, expected }) => {
24+
expect(actual).toEqual(expect.arrayContaining(expected));
25+
});
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`default reporter > merge identical errors 1`] = `
4+
"
5+
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 6 ⎯⎯⎯⎯⎯⎯⎯
6+
7+
FAIL basic.test.ts > test-a 1
8+
AssertionError: expected 1 to be +0 // Object.is equality
9+
10+
- Expected
11+
+ Received
12+
13+
- 0
14+
+ 1
15+
16+
❯ basic.test.ts:5:13
17+
3| // not merged
18+
4| test.for([1, 2])("test-a %$", (n) => {
19+
5| expect(n).toBe(0);
20+
| ^
21+
6| });
22+
7|
23+
24+
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯
25+
26+
FAIL basic.test.ts > test-a 2
27+
AssertionError: expected 2 to be +0 // Object.is equality
28+
29+
- Expected
30+
+ Received
31+
32+
- 0
33+
+ 2
34+
35+
❯ basic.test.ts:5:13
36+
3| // not merged
37+
4| test.for([1, 2])("test-a %$", (n) => {
38+
5| expect(n).toBe(0);
39+
| ^
40+
6| });
41+
7|
42+
43+
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯
44+
45+
FAIL basic.test.ts > test-b 1
46+
FAIL basic.test.ts > test-b 2
47+
AssertionError: expected 1 to be +0 // Object.is equality
48+
49+
- Expected
50+
+ Received
51+
52+
- 0
53+
+ 1
54+
55+
❯ basic.test.ts:10:13
56+
8| // merged
57+
9| test.for([1, 2])("test-b %$", (n) => {
58+
10| expect(1).toBe(0);
59+
| ^
60+
11| });
61+
12|
62+
63+
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯
64+
65+
FAIL basic.test.ts > test-c 1
66+
AssertionError: expected [ Array(1) ] to deeply equal ArrayContaining{}
67+
68+
- Expected
69+
+ Received
70+
71+
- ArrayContaining [
72+
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
73+
+ [
74+
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
75+
]
76+
77+
❯ basic.test.ts:24:18
78+
22| },
79+
23| ])("test-c %$", async ({ actual, expected }) => {
80+
24| expect(actual).toEqual(expect.arrayContaining(expected));
81+
| ^
82+
25| });
83+
26|
84+
85+
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯
86+
87+
FAIL basic.test.ts > test-c 2
88+
AssertionError: expected [ Array(1) ] to deeply equal ArrayContaining{}
89+
90+
- Expected
91+
+ Received
92+
93+
- ArrayContaining [
94+
- "dddddddddddddddddddddddddddddddddddddddddddddddddd",
95+
+ [
96+
+ "cccccccccccccccccccccccccccccccccccccccccccccccccc",
97+
]
98+
99+
❯ basic.test.ts:24:18
100+
22| },
101+
23| ])("test-c %$", async ({ actual, expected }) => {
102+
24| expect(actual).toEqual(expect.arrayContaining(expected));
103+
| ^
104+
25| });
105+
26|
106+
107+
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯
108+
109+
"
110+
`;

test/reporters/tests/default.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,13 @@ describe('default reporter', async () => {
290290

291291
expect(stderr).toMatch('FAIL > { name: fails, meta: Failing test added this } (Custom getFullName here')
292292
})
293+
294+
test('merge identical errors', async () => {
295+
const { stderr } = await runVitest({
296+
root: 'fixtures/merge-errors',
297+
reporters: [['default', { isTTY: true, summary: false }]],
298+
config: false,
299+
})
300+
expect(stderr).toMatchSnapshot()
301+
})
293302
}, 120000)

0 commit comments

Comments
 (0)