Skip to content

Commit 3cbbb17

Browse files
authored
fix: fix re-mocking virtual module (#9748)
1 parent 5e1f6f9 commit 3cbbb17

File tree

5 files changed

+94
-3
lines changed

5 files changed

+94
-3
lines changed

packages/vitest/src/runtime/moduleRunner/startVitestModuleRunner.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ export function startVitestModuleRunner(options: ContextModuleRunnerOptions): Vi
108108
return {
109109
code: '',
110110
file: null,
111-
id,
112-
url: id,
111+
id: resolvedMock.id,
112+
url: resolvedMock.url,
113113
invalidate: false,
114114
mockedModule: resolvedMock,
115115
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { expect, test, vi } from 'vitest'
2+
3+
test('multiple resetModules and doMock for indirect actual module', async () => {
4+
vi.doUnmock('./fixtures/increment')
5+
6+
const { incrementIndirect: originalIncrement } = await import('./fixtures/increment-indirect')
7+
expect(originalIncrement(1)).toBe(2)
8+
9+
vi.doMock('./fixtures/increment', () => ({
10+
increment: (num: number) => num + 10,
11+
}))
12+
vi.resetModules()
13+
14+
const { incrementIndirect: incrementWith10 } = await import('./fixtures/increment-indirect')
15+
expect(incrementWith10(1)).toBe(11)
16+
17+
vi.doMock('./fixtures/increment', () => ({
18+
increment: (num: number) => num + 20,
19+
}))
20+
vi.resetModules()
21+
22+
const { incrementIndirect: incrementWith20 } = await import('./fixtures/increment-indirect')
23+
expect(incrementWith20(1)).toBe(21)
24+
25+
vi.doMock('./fixtures/increment', () => ({
26+
increment: (num: number) => num + 30,
27+
}))
28+
29+
const { incrementIndirect: incrementWith20Still } = await import('./fixtures/increment-indirect')
30+
expect(incrementWith20Still(1)).toBe(21)
31+
})
32+
33+
test('multiple doMock for direct virtual module', async () => {
34+
// @ts-expect-error virtual module
35+
const { value: originalValue } = await import('virtual-module-direct')
36+
expect(originalValue).toBe('original-direct')
37+
38+
vi.doMock('virtual-module-direct', () => ({
39+
value: 'direct-1',
40+
}))
41+
42+
// @ts-expect-error virtual module
43+
const { value: mockedValue1 } = await import('virtual-module-direct')
44+
expect(mockedValue1).toBe('direct-1')
45+
46+
vi.doMock('virtual-module-direct', () => ({
47+
value: 'direct-2',
48+
}))
49+
50+
// @ts-expect-error virtual module
51+
const { value: mockedValue2 } = await import('virtual-module-direct')
52+
expect(mockedValue2).toBe('direct-2')
53+
})
54+
55+
test('multiple resetModules and doMock for indirect virtual module', async () => {
56+
const { getVirtualValue: originalGetVirtualValue } = await import('./fixtures/virtual-module-indirect')
57+
expect(originalGetVirtualValue()).toBe('original-indirect')
58+
59+
vi.doMock('virtual-module-indirect', () => ({ value: 'indirect-1' }))
60+
vi.resetModules()
61+
62+
const { getVirtualValue: mockedGetVirtualValue1 } = await import('./fixtures/virtual-module-indirect')
63+
expect(mockedGetVirtualValue1()).toBe('indirect-1')
64+
65+
vi.resetModules()
66+
vi.doMock('virtual-module-indirect', () => ({ value: 'indirect-2' }))
67+
68+
const { getVirtualValue: mockedGetVirtualValue2 } = await import('./fixtures/virtual-module-indirect')
69+
expect(mockedGetVirtualValue2()).toBe('indirect-2')
70+
})
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { increment } from './increment'
2+
3+
export function incrementIndirect(num: number) {
4+
return increment(num)
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @ts-expect-error virtual module
2+
import { value } from 'virtual-module-indirect'
3+
4+
export function getVirtualValue() {
5+
return value
6+
}

test/core/vite.config.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default defineConfig({
1111
{
1212
name: 'example',
1313
resolveId(source) {
14-
if (source === 'virtual-module') {
14+
if (source === 'virtual-module' || source === 'virtual-module-direct' || source === 'virtual-module-indirect') {
1515
return source
1616
}
1717
},
@@ -21,6 +21,16 @@ export default defineConfig({
2121
export const value = 'original';
2222
`
2323
}
24+
if (id === 'virtual-module-direct') {
25+
return `
26+
export const value = 'original-direct';
27+
`
28+
}
29+
if (id === 'virtual-module-indirect') {
30+
return `
31+
export const value = 'original-indirect';
32+
`
33+
}
2434
},
2535
},
2636
],

0 commit comments

Comments
 (0)