Skip to content

Commit fb4500b

Browse files
authored
fix: show the assertion error first when expect.poll assertion fails (#8483)
1 parent 549d321 commit fb4500b

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

packages/vitest/src/integrations/chai/poll.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,13 @@ export function createExpectPoll(expect: ExpectStatic): ExpectStatic['poll'] {
8888
timeoutId = setTimeout(() => {
8989
clearTimeout(intervalId)
9090
chai.util.flag(assertion, '_isLastPollAttempt', true)
91-
const rejectWithCause = (cause: any) => {
91+
const rejectWithCause = (error: any) => {
92+
if (error.cause == null) {
93+
error.cause = new Error('Matcher did not succeed in time.')
94+
}
9295
reject(
9396
copyStackTrace(
94-
new Error('Matcher did not succeed in time.', {
95-
cause,
96-
}),
97+
error,
9798
STACK_TRACE_ERROR,
9899
),
99100
)

test/core/test/expect-poll.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ test('timeout', async () => {
3737
await expect(async () => {
3838
await expect.poll(() => false, { timeout: 100, interval: 10 }).toBe(true)
3939
}).rejects.toThrowError(expect.objectContaining({
40-
message: 'Matcher did not succeed in time.',
40+
message: 'expected false to be true // Object.is equality',
4141
stack: expect.stringContaining('expect-poll.test.ts:38:68'),
4242
cause: expect.objectContaining({
43-
message: 'expected false to be true // Object.is equality',
43+
message: 'Matcher did not succeed in time.',
4444
}),
4545
}))
4646
})
@@ -60,7 +60,7 @@ test('fake timers don\'t break it', async () => {
6060
vi.useFakeTimers()
6161
await expect(async () => {
6262
await expect.poll(() => false, { timeout: 100 }).toBe(true)
63-
}).rejects.toThrowError('Matcher did not succeed in time.')
63+
}).rejects.toThrowError('expected false to be true // Object.is equality')
6464
vi.useRealTimers()
6565
const diff = Date.now() - now
6666
expect(diff >= 100).toBe(true)
@@ -91,18 +91,18 @@ test('toBeDefined', async () => {
9191
await expect(() =>
9292
expect.poll(() => 1, { timeout: 100, interval: 10 }).not.toBeDefined(),
9393
).rejects.toThrowError(expect.objectContaining({
94-
message: 'Matcher did not succeed in time.',
94+
message: 'expected 1 to be undefined',
9595
cause: expect.objectContaining({
96-
message: 'expected 1 to be undefined',
96+
message: 'Matcher did not succeed in time.',
9797
}),
9898
}))
9999

100100
await expect(() =>
101101
expect.poll(() => undefined, { timeout: 100, interval: 10 }).toBeDefined(),
102102
).rejects.toThrowError(expect.objectContaining({
103-
message: 'Matcher did not succeed in time.',
103+
message: 'expected undefined to be defined',
104104
cause: expect.objectContaining({
105-
message: 'expected undefined to be defined',
105+
message: 'Matcher did not succeed in time.',
106106
}),
107107
}))
108108
})
@@ -140,10 +140,10 @@ test('should handle failure on last attempt', async () => {
140140
await expect(async () => {
141141
await expect.poll(fn, { interval: 10, timeout: 100 }).toBe(1)
142142
}).rejects.toThrowError(expect.objectContaining({
143-
message: 'Matcher did not succeed in time.',
143+
// makes sure cause message reflects the last attempt value
144+
message: 'expected 3 to be 1 // Object.is equality',
144145
cause: expect.objectContaining({
145-
// makes sure cause message reflects the last attempt value
146-
message: 'expected 3 to be 1 // Object.is equality',
146+
message: 'Matcher did not succeed in time.',
147147
}),
148148
}))
149149
})

0 commit comments

Comments
 (0)