使用Jest重置单个模块

Tam*_*lyn 23 commonjs node.js jestjs

jest.resetModules()清除所有模块的require缓存,但有没有办法只清除单个模块?无法使用,require.cache因为Jest似乎绕过它.

我正在测试一个有状态的Node模块(即它依赖于多次调用以require返回相同实例的事实).对于我的测试,我需要重置模块的状态以测试不同的场景.jest.resetModules()但是我需要重新设置require一些不需要重置的模拟模块.

Far*_*hat 11

从 Jest 24 开始,您现在可以使用jest.isolateModules来执行此操作。

假设您只想重置某个模块,那么您应该在以下回调中要求jest.isolateModules

let myModule;
jest.isolateModules(() => {
  myModule = require('my-certain-module');
});
Run Code Online (Sandbox Code Playgroud)

  • 我们能得到一个扩展的例子吗?这类似于笑话文档,它没有明确说明正在发生的事情或如何使用它 (9认同)

Ben*_*Ben 9

用于某些测试的模拟模块(带有工厂)以及在测试文件中恢复其他模块的示例

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

  });
});
Run Code Online (Sandbox Code Playgroud)