使用Jest重置单个模块

时间:2017-08-08 15:00:25

标签: node.js jestjs commonjs

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

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

2 个答案:

答案 0 :(得分:2)

评论中提到的PR已合并。从v24.0.0-alpha.9开始,您现在可以使用jest.isolateModules来完成此操作。

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

let myModule;
jest.isolateModules(() => {
  myModule = require('my-certain-module');
});

答案 1 :(得分:2)

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

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

  });
});