jest.mock 和 jest.doMock 的区别

Chr*_*lus 10 testing mocking jestjs

我希望这特定于单个测试:

  it('should mock the module a single time', () => {
    jest.doMock('../../../../../../../components/HighCharts/HighCharts', () => {
      return () => <div id="mock-line-chart" />;
    });
  })
Run Code Online (Sandbox Code Playgroud)

但它不起作用。这适用于整个文件:

jest.mock('../../../../../../../components/HighCharts/HighCharts', () => {
  return () => <div id="my-special-div" />;
});
Run Code Online (Sandbox Code Playgroud)

我用的不对吗?doMock 和 mock 的区别在哪里。我是否适合仅针对单个测试进行模块模拟?

Est*_*ask 17

jest.mock上述悬挂import在顶层中使用并提升到在一个块中使用时的块(测试功能范围等),对于相同的开始时jest.unmockjest.doMockjest.dontMock服务于相同的目的,但没有被提升。

这对于这样的案例很重要:

  it('should mock the module a single time', () => {
    let originalHighCharts = require('.../HighCharts');
    ...
    jest.doMock('.../HighCharts', ...);
    let mockedHighCharts = require('.../HighCharts');
    ...
  })
Run Code Online (Sandbox Code Playgroud)

doMock允许特定顺序是在实践中很少有用的,因为嘲笑模块可与进行检索jest.requireActual,而相同的序列可以不影响依赖因为缓存的嘲笑模块上的其他模块。

doMockdontMock没有被提升允许将它们一起用于指定的场景来模拟单个测试的模块:

let HighCharts;
jest.isolateModules(() => {
  jest.doMock('.../HighCharts', ...);;
  HighCharts = require('.../HighCharts');
  jest.dontMock('.../HighCharts');
});
Run Code Online (Sandbox Code Playgroud)

缺点是dontMock导入失败可能无法执行,会影响其他测试,这个需要额外处理。强制执行对大多数测试更可取的默认模块状态可能更直接:

beforeEach(() => {
  jest.unmock('.../HighCharts');
  jest.resetModules();
});
Run Code Online (Sandbox Code Playgroud)

  • Jest 尝试将 jest.mock 推到相关导入之上。它不会为 doMock 执行此操作。这就是区别。 (2认同)