我正在尝试react-router-dom
在一个测试用例中进行模拟,以使该useHistory
挂钩在我的测试中起作用。我决定使用jest.mock
来模拟整个模块,并jest.requireActual
保留我可能不想模拟的其他属性。
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useHistory: () => ({
location: {
pathname: '/list',
},
}),
}));
这实际上是从以下问题的高度评价的解决方案之一得出的:如何在嘲笑中模拟useHistory挂钩?
但是,TypeScript编译器在下一行标记了以下错误 ...jest.requireActual('react-router-dom'),
TS2698:传播类型只能从对象类型创建。
有趣的是,我仅在将jest和ts-jest更新到最新版本(jest v26)之后才遇到此问题。使用jest 24.xx时,我没有遇到任何这些问题
"@types/jest": "^26.0.4",
"jest": "^26.1.0",
"ts-jest": "^26.1.1",
有谁知道如何解决最新的玩笑版本的问题?
jest.requireActual
返回unknown
无法传播的类型。
正确的类型是:
import * as ReactRouterDom from 'react-router-dom';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as typeof ReactRouterDom,
useHistory: ...,
}));
一个快速的解决方法是any
:
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
useHistory: ...,
}));
这是可以接受的,因为在这种情况下它不会损害类型安全性。
由于react-router-dom
是ES模块,因此模拟它的更正确方法是:
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
__esModule: true,
useHistory: ...,
}));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句