Skip to content

Commit d030ac6

Browse files
committed
feat(runtime): add jest.mockModule
1 parent a03b6fe commit d030ac6

File tree

6 files changed

+203
-24
lines changed

6 files changed

+203
-24
lines changed

e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ FAIL __tests__/index.js
4141
12 | module.exports = () => 'test';
4242
13 |
4343
44-
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:558:17)
44+
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:557:17)
4545
at Object.require (index.js:10:1)
4646
`;
4747

@@ -70,6 +70,6 @@ FAIL __tests__/index.js
7070
12 | module.exports = () => 'test';
7171
13 |
7272
73-
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:558:17)
73+
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:557:17)
7474
at Object.require (index.js:10:1)
7575
`;

e2e/__tests__/__snapshots__/nativeEsm.test.ts.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Ran all test suites matching /native-esm.tla.test.js/i.
1010
1111
exports[`on node ^12.16.0 || >=13.7.0 runs test with native ESM 1`] = `
1212
Test Suites: 1 passed, 1 total
13-
Tests: 18 passed, 18 total
13+
Tests: 19 passed, 19 total
1414
Snapshots: 0 total
1515
Time: <<REPLACED>>
1616
Ran all test suites matching /native-esm.test.js/i.

e2e/native-esm/__tests__/native-esm.test.js

+11
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,14 @@ test('handle circular dependency', async () => {
166166
expect(moduleA.moduleB.id).toBe('circularDependentB');
167167
expect(moduleA.moduleB.moduleA).toBe(moduleA);
168168
});
169+
170+
test('can mock module', async () => {
171+
jestObject.mockModule('../mockedModule.mjs', () => ({foo: 'bar'}), {
172+
virtual: true,
173+
});
174+
175+
const importedMock = await import('../mockedModule.mjs');
176+
177+
expect(Object.keys(importedMock)).toEqual(['foo']);
178+
expect(importedMock.foo).toEqual('bar');
179+
});

packages/jest-environment/src/index.ts

+8
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ export interface Jest {
137137
moduleFactory?: () => unknown,
138138
options?: {virtual?: boolean},
139139
): Jest;
140+
/**
141+
* Mocks a module with an auto-mocked version when it is being required.
142+
*/
143+
mockModule(
144+
moduleName: string,
145+
moduleFactory?: () => Promise<unknown> | unknown,
146+
options?: {virtual?: boolean},
147+
): Jest;
140148
/**
141149
* Returns the actual module instead of a mock, bypassing all checks on
142150
* whether the module should receive a mock implementation or not.

packages/jest-resolve/src/index.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,8 @@ export default class Resolver {
313313
getModuleID(
314314
virtualMocks: Map<string, boolean>,
315315
from: Config.Path,
316-
_moduleName?: string,
316+
moduleName = '',
317317
): string {
318-
const moduleName = _moduleName || '';
319-
320318
const key = from + path.delimiter + moduleName;
321319
const cachedModuleID = this._moduleIDCache.get(key);
322320
if (cachedModuleID) {

0 commit comments

Comments
 (0)