用 Jest 重置单个模块
Reset single module with Jest
jest.resetModules()
清除所有模块的 require 缓存,但有没有办法只清除单个模块的缓存?无法使用 require.cache
,因为 Jest 似乎绕过了它。
我正在测试一个有状态的 Node 模块(即它依赖于多次调用 require
return 同一实例这一事实)。对于我的测试,我需要重置模块的状态以测试不同的场景。 jest.resetModules()
有效,但我需要重新 require
一些不需要重置的其他模拟模块。
如问题中所述,jest.resetModules()
重置模块缓存,这对您的模块保持一些本地状态很有用,而您想在测试之间摆脱该状态。
resetModules 的问题在于它会重置所有内容,但有时您只想重置部分模块。
从 Jest 24 开始,您现在可以使用 jest.isolateModules
来执行此操作。
假设您有一个保持状态的模块:
module.js
exports.a = 1
exports.add = function (a) {
return exports.a += a;
}
module.test.js
test('adds 1 to counter', () => {
jest.isolateModules(() => {
const myModule = require('./module');
expect(myModule.add(1)).toBe(2);
expect(myModule.add(1)).toBe(3);
});
});
test('adds 2 to counter', () => {
jest.isolateModules(() => {
const myModule = require('./module');
expect(myModule.add(2)).toBe(3);
expect(myModule.add(2)).toBe(5);
});
});
基本上在每次 jest.isolateModules() 调用后,下次需要该模块时,它将具有一个新状态。
在测试文件中为某些测试模拟模块(带工厂)并为其他测试恢复的示例
describe("some tests", () => {
let subject;
describe("with mocks", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.doMock("some-lib", () => ({ someFn: jest.fn() })); // .doMock doesnt hoist like .mock does when using babel-jest
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is mocked
});
describe("without mocks - restoring mocked modules", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.unmock("some-lib");
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is NOT mocked
});
});
jest.resetModules()
清除所有模块的 require 缓存,但有没有办法只清除单个模块的缓存?无法使用 require.cache
,因为 Jest 似乎绕过了它。
我正在测试一个有状态的 Node 模块(即它依赖于多次调用 require
return 同一实例这一事实)。对于我的测试,我需要重置模块的状态以测试不同的场景。 jest.resetModules()
有效,但我需要重新 require
一些不需要重置的其他模拟模块。
如问题中所述,jest.resetModules()
重置模块缓存,这对您的模块保持一些本地状态很有用,而您想在测试之间摆脱该状态。
resetModules 的问题在于它会重置所有内容,但有时您只想重置部分模块。
从 Jest 24 开始,您现在可以使用 jest.isolateModules
来执行此操作。
假设您有一个保持状态的模块:
module.js
exports.a = 1
exports.add = function (a) {
return exports.a += a;
}
module.test.js
test('adds 1 to counter', () => {
jest.isolateModules(() => {
const myModule = require('./module');
expect(myModule.add(1)).toBe(2);
expect(myModule.add(1)).toBe(3);
});
});
test('adds 2 to counter', () => {
jest.isolateModules(() => {
const myModule = require('./module');
expect(myModule.add(2)).toBe(3);
expect(myModule.add(2)).toBe(5);
});
});
基本上在每次 jest.isolateModules() 调用后,下次需要该模块时,它将具有一个新状态。
在测试文件中为某些测试模拟模块(带工厂)并为其他测试恢复的示例
describe("some tests", () => {
let subject;
describe("with mocks", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.doMock("some-lib", () => ({ someFn: jest.fn() })); // .doMock doesnt hoist like .mock does when using babel-jest
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is mocked
});
describe("without mocks - restoring mocked modules", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.unmock("some-lib");
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is NOT mocked
});
});