【发布时间】: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