Skip to content

Commit 2fa763a

Browse files
authored
fix: reset mocks on test retry/repeat (#7897)
1 parent deb1bc2 commit 2fa763a

File tree

2 files changed

+87
-2
lines changed

2 files changed

+87
-2
lines changed

packages/vitest/src/runtime/runners/test.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ export class VitestTestRunner implements VitestRunner {
9595
return
9696
}
9797

98-
clearModuleMocks(this.config)
99-
10098
this.workerState.current = test
10199
}
102100

@@ -117,6 +115,7 @@ export class VitestTestRunner implements VitestRunner {
117115
}
118116

119117
onBeforeTryTask(test: Task): void {
118+
clearModuleMocks(this.config)
120119
this.snapshotClient.clearTest(test.file.filepath, test.id)
121120
setState(
122121
{
+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import type { TestCase } from 'vitest/node'
2+
import { expect, it } from 'vitest'
3+
import { runInlineTests } from '../../test-utils'
4+
5+
it('vitest correctly resets mocks between tests', async () => {
6+
const { stderr, results } = await runInlineTests({
7+
'basic.test.js': /* js */`
8+
import { it, vi, expect } from 'vitest'
9+
let i = 0
10+
const mock = vi.fn(() => true)
11+
it('mock resets', { retry: 3 }, () => {
12+
i++
13+
expect(mock()).toBe(true)
14+
mock.mockImplementation(() => false)
15+
if (i !== 4) {
16+
throw new Error('retry')
17+
}
18+
expect(mock).toHaveBeenCalledOnce()
19+
})
20+
`,
21+
'vitest.config.js': {
22+
test: {
23+
mockReset: true,
24+
},
25+
},
26+
})
27+
expect(stderr).toBe('')
28+
const testCase = results[0].children.at(0) as TestCase
29+
expect(testCase.diagnostic()?.retryCount).toBe(3)
30+
})
31+
32+
it('vitest correctly clears mocks between tests', async () => {
33+
const { stderr, results } = await runInlineTests({
34+
'basic.test.js': /* js */`
35+
import { it, vi, expect } from 'vitest'
36+
let i = 0
37+
const mock = vi.fn()
38+
it('mock resets', { retry: 3 }, () => {
39+
i++
40+
mock()
41+
if (i !== 4) {
42+
throw new Error('retry')
43+
}
44+
expect(mock).toHaveBeenCalledOnce()
45+
})
46+
`,
47+
'vitest.config.js': {
48+
test: {
49+
clearMocks: true,
50+
},
51+
},
52+
})
53+
expect(stderr).toBe('')
54+
const testCase = results[0].children.at(0) as TestCase
55+
expect(testCase.diagnostic()?.retryCount).toBe(3)
56+
})
57+
58+
it('vitest correctly restores mocks between tests', async () => {
59+
const { stderr, results } = await runInlineTests({
60+
'basic.test.js': /* js */`
61+
import { it, vi, expect } from 'vitest'
62+
let i = 0
63+
const obj = {
64+
mock: () => true
65+
}
66+
const mock = vi.spyOn(obj, 'mock')
67+
it('mock resets', { retry: 3 }, () => {
68+
i++
69+
expect(obj.mock()).toBe(true)
70+
expect(vi.isMockFunction(obj.mock)).toBe(false)
71+
mock.mockImplementation(() => false)
72+
if (i !== 4) {
73+
throw new Error('retry')
74+
}
75+
})
76+
`,
77+
'vitest.config.js': {
78+
test: {
79+
restoreMocks: true,
80+
},
81+
},
82+
})
83+
expect(stderr).toBe('')
84+
const testCase = results[0].children.at(0) as TestCase
85+
expect(testCase.diagnostic()?.retryCount).toBe(3)
86+
})

0 commit comments

Comments
 (0)