测试在不同文件中具有依赖关系的模块时.将该模块指定为jest时.Mock typescript会给出一个错误,即依赖项上不存在方法mockReturnThisOnce(或任何其他jest.Mock方法),这是因为它以前是键入的.从jest.Mock获取typescript继承类型的正确方法是什么?
这是一个简单的例子.
依赖
- const myDep = (name: string) => name;
- export default myDep;
test.ts
- import * as dep from '../depenendency';
- jest.mock('../dependency');
- it('should do what I need',() => {
- //this throws ts error
- // Property mockReturnValueOnce does not exist on type (name: string)....
- dep.default.mockReturnValueOnce('return')
- }
我觉得这是一个非常常见的用例,不知道如何正确输入.任何帮助将非常感激!
解决方法
您可以使用类型转换,您的test.ts应如下所示:
- import * as dep from '../dependency';
- jest.mock('../dependency');
- const mockedDependency = <jest.Mock<typeof dep.default>>dep.default;
- it('should do what I need',() => {
- //this throws ts error
- // Property mockReturnValueOnce does not exist on type (name: string)....
- mockedDependency.mockReturnValueOnce('return');
- });
TS转换器不知道jest.mock(‘../ dependency’);更改dep的类型,因此您必须使用类型转换.由于导入的dep不是类型定义,因此必须使用typeof dep.default获取其类型.
以下是我在使用Jest和TS时发现的其他有用模式
当导入的元素是一个类时,您不必使用typeof例如:
- import { SomeClass } from './SomeClass';
- jest.mock('./SomeClass');
- const mockedClass = <jest.Mock<SomeClass>>SomeClass;
当您必须模拟某些节点本机模块时,此解决方案也很有用:
- import { existsSync } from 'fs';
- jest.mock('fs');
- const mockedExistsSync = <jest.Mock<typeof existsSync>>existsSync;
如果你不想使用jest自动模拟而更喜欢创建手动模拟
- import TestedClass from './TestedClass';
- import TestedClassDependency from './TestedClassDependency';
- const testedClassDependencyMock = jest.fn<TestedClassDependency>(() => ({
- // implementation
- }));
- it('Should throw an error when calling playSomethingCool',() => {
- const testedClass = new TestedClass(testedClassDependencyMock());
- });
testedClassDependencyMock()创建模拟对象实例TestedClassDependency可以是类,也可以是类型或接口