首页 > 解决方案 > 为什么 jest.isolateModules 没有按预期工作?

问题描述

我想停止使用,jest.resetModules因为我想重置两个模块,但在所有运行中保留一个。

我原来的代码让事情像这样工作很糟糕:

beforeEach(() => {
  jest.resetModules();
  require('hooks/useMyProvider');
  const useMyProvider = require('#/');
  api = useMyProvider(); // scoped above
})

然后在每次测试中,我会做这样的事情:

// Mock hook since we can't spy on a function
jest.doMock('#/hooks/useActive', () => {
  return () => {
    return [true]
  }
});

// re-require the component that requires useActive so it pulls latest mock
let MyComponent = require('#/components/MyComponent')

const { container } = render(<MyComponent />);

我尝试重构为useMyProvider在文件顶部定义一次并jest.resetModulesbeforeEach;

然后我这样做了:

let MyComponent;

jest.isolateModules(() => {
  jest.doMock('#/hooks/useActive', () => {
    return () => {
      return [true]
    }
  });

  MyComponent = require('#/components/MyComponent')
});

const { container } = render(<MyComponent />);

当我在两次测试中这样做并在返回时换掉时truefalse无论哪个测试先到都会坚持下去。我希望它每次都会改变,因为我已经隔离了模块。

标签: reactjsjestjsreact-hooks

解决方案


推荐阅读