javascript – 使用打字稿模拟对jest的依赖

前端之家收集整理的这篇文章主要介绍了javascript – 使用打字稿模拟对jest的依赖前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
测试在不同文件中具有依赖关系的模块时.将该模块指定为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可以是类,也可以是类型或接口

原文链接:https://www.f2er.com/js/156936.html

猜你在找的JavaScript相关文章