测试在不同文件中具有依赖关系的模块时.将该模块指定为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可以是类,也可以是类型或接口