diff --git a/packages/vitest/src/runtime/runners/test.ts b/packages/vitest/src/runtime/runners/test.ts index d48adec04..b1ab1154d 100644 --- a/packages/vitest/src/runtime/runners/test.ts +++ b/packages/vitest/src/runtime/runners/test.ts @@ -95,8 +95,6 @@ export class VitestTestRunner implements VitestRunner { return } - clearModuleMocks(this.config) - this.workerState.current = test } @@ -117,6 +115,7 @@ export class VitestTestRunner implements VitestRunner { } onBeforeTryTask(test: Task): void { + clearModuleMocks(this.config) this.snapshotClient.clearTest(test.file.filepath, test.id) setState( { diff --git a/test/cli/test/retry-clear-mocks.test.ts b/test/cli/test/retry-clear-mocks.test.ts new file mode 100644 index 000000000..64460cdcc --- /dev/null +++ b/test/cli/test/retry-clear-mocks.test.ts @@ -0,0 +1,86 @@ +import type { TestCase } from 'vitest/node' +import { expect, it } from 'vitest' +import { runInlineTests } from '../../test-utils' + +it('vitest correctly resets mocks between tests', async () => { + const { stderr, results } = await runInlineTests({ + 'basic.test.js': /* js */` + import { it, vi, expect } from 'vitest' + let i = 0 + const mock = vi.fn(() => true) + it('mock resets', { retry: 3 }, () => { + i++ + expect(mock()).toBe(true) + mock.mockImplementation(() => false) + if (i !== 4) { + throw new Error('retry') + } + expect(mock).toHaveBeenCalledOnce() + }) + `, + 'vitest.config.js': { + test: { + mockReset: true, + }, + }, + }) + expect(stderr).toBe('') + const testCase = results[0].children.at(0) as TestCase + expect(testCase.diagnostic()?.retryCount).toBe(3) +}) + +it('vitest correctly clears mocks between tests', async () => { + const { stderr, results } = await runInlineTests({ + 'basic.test.js': /* js */` + import { it, vi, expect } from 'vitest' + let i = 0 + const mock = vi.fn() + it('mock resets', { retry: 3 }, () => { + i++ + mock() + if (i !== 4) { + throw new Error('retry') + } + expect(mock).toHaveBeenCalledOnce() + }) + `, + 'vitest.config.js': { + test: { + clearMocks: true, + }, + }, + }) + expect(stderr).toBe('') + const testCase = results[0].children.at(0) as TestCase + expect(testCase.diagnostic()?.retryCount).toBe(3) +}) + +it('vitest correctly restores mocks between tests', async () => { + const { stderr, results } = await runInlineTests({ + 'basic.test.js': /* js */` + import { it, vi, expect } from 'vitest' + let i = 0 + const obj = { + mock: () => true + } + const mock = vi.spyOn(obj, 'mock') + it('mock resets', { retry: 3 }, () => { + i++ + expect(obj.mock()).toBe(true) + expect(vi.isMockFunction(obj.mock)).toBe(false) + mock.mockImplementation(() => false) + if (i !== 4) { + throw new Error('retry') + } + }) + `, + 'vitest.config.js': { + test: { + restoreMocks: true, + }, + }, + }) + expect(stderr).toBe('') + const testCase = results[0].children.at(0) as TestCase + expect(testCase.diagnostic()?.retryCount).toBe(3) +})