【问题标题】:How to reset a specific method of a module with resetAllMocks in Jest?如何在 Jest 中使用 resetAllMocks 重置模块的特定方法?
【发布时间】:2021-10-21 10:05:55
【问题描述】:

我已经为此研究了很长时间,没有一个答案可以解决问题。我有resetAllMocksafterEach 测试集。我想模拟一个模块的特定方法。

如果我:

import * as ReactRouter from 'react-router';
const mockPush = jest.fn();
jest.mock('react-router', () => ({
  ...jest.requireActual('react-router'),
  useHistory: () => {
    return { push: mockPush };
  },
  useRouteMatch: jest.fn().mockReturnValue({ url: '' })
}));

它在第一个测试用例中运行良好,但在第二个测试用例中会抛出: TypeError: Cannot destructure property 'url' of 'react_router_1.useRouteMatch(...)' as it is undefined.

如果我:

import * as ReactRouter from 'react-router';
const mockPush = jest.fn();

beforeEach(() => {
  jest.mock('react-router', () => ({
    ...jest.requireActual('react-router'),
    useHistory: () => {
      return { push: mockPush };
    },
    useRouteMatch: jest.fn().mockReturnValue({ url: '' })
  }));
})

它什么都不做(不模拟值)。

如果我:

import * as ReactRouter from 'react-router';
jest.mock('react-router');
const mockPush = jest.fn();

beforeEach(() => {
  jest.spyOn(ReactRouter, 'useHistory').mockReturnValue({ push: mockPush } as any)
  jest.spyOn(ReactRouter, 'useRouteMatch').mockReturnValue({ url: '' } as any)
})

它什么都不做(破坏其他功能而不会引发任何错误)。

如果我:

import * as ReactRouter from 'react-router';
const mockPush = jest.fn();

beforeEach(() => {
  jest.spyOn(ReactRouter, 'useHistory').mockReturnValue({ push: mockPush } as any)
  jest.spyOn(ReactRouter, 'useRouteMatch').mockReturnValue({ url: '' } as any)
})

它抛出:TypeError: Cannot redefine property: useHistory at Function.defineProperty (<anonymous>)

不确定在测试后重置所有模拟是否如此不常见,因此无需重新模拟,但我找不到在每次测试前进行重新模拟的合适解决方案。

【问题讨论】:

    标签: javascript reactjs module jestjs mocking


    【解决方案1】:

    最后我设法通过首先模拟目标方法首先使用 jest.fn() 来解决问题,然后使用jest.requireActual 导入其余方法。

    然后在beforeEach 内部进行模拟实现,例如:

    import * as ReactRouter from 'react-router';
    
    jest.mock('react-router', () => ({
      ...jest.requireActual('react-router'),
      useHistory: jest.fn(),
      useRouteMatch: jest.fn()
    }));
    
    const mockPush = jest.fn();
    
    beforeEach(() => {
      jest.spyOn(ReactRouter, 'useHistory').mockReturnValue({ push: mockPush } as any);
      jest.spyOn(ReactRouter, 'useRouteMatch').mockReturnValue({ url: '' } as any);
    });
    
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2018-06-21
      • 1970-01-01
      • 2020-03-31
      • 2018-01-16
      • 2018-02-19
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多