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

前端之家收集整理的这篇文章主要介绍了javascript – 使用打字稿模拟对jest的依赖前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
测试在不同文件中具有依赖关系的模块时.将该模块指定为jest时.Mock typescript会给出一个错误,即依赖项上不存在方法mockReturnThisOnce(或任何其他jest.Mock方法),这是因为它以前是键入的.从jest.Mock获取typescript继承类型的正确方法是什么?

这是一个简单的例子.

依赖

  1. const myDep = (name: string) => name;
  2. export default myDep;

test.ts

  1. import * as dep from '../depenendency';
  2. jest.mock('../dependency');
  3.  
  4. it('should do what I need',() => {
  5. //this throws ts error
  6. // Property mockReturnValueOnce does not exist on type (name: string)....
  7. dep.default.mockReturnValueOnce('return')
  8. }

我觉得这是一个非常常见的用例,不知道如何正确输入.任何帮助将非常感激!

解决方法

您可以使用类型转换,您的test.ts应如下所示:
  1. import * as dep from '../dependency';
  2. jest.mock('../dependency');
  3.  
  4. const mockedDependency = <jest.Mock<typeof dep.default>>dep.default;
  5.  
  6. it('should do what I need',() => {
  7. //this throws ts error
  8. // Property mockReturnValueOnce does not exist on type (name: string)....
  9. mockedDependency.mockReturnValueOnce('return');
  10. });

TS转换器不知道jest.mock(‘../ dependency’);更改dep的类型,因此您必须使用类型转换.由于导入的dep不是类型定义,因此必须使用typeof dep.default获取其类型.

以下是我在使用Jest和TS时发现的其他有用模式

当导入的元素是一个类时,您不必使用typeof例如:

  1. import { SomeClass } from './SomeClass';
  2.  
  3. jest.mock('./SomeClass');
  4.  
  5. const mockedClass = <jest.Mock<SomeClass>>SomeClass;

当您必须模拟某些节点本机模块时,此解决方案也很有用:

  1. import { existsSync } from 'fs';
  2.  
  3. jest.mock('fs');
  4.  
  5. const mockedExistsSync = <jest.Mock<typeof existsSync>>existsSync;

如果你不想使用jest自动模拟而更喜欢创建手动模拟

  1. import TestedClass from './TestedClass';
  2. import TestedClassDependency from './TestedClassDependency';
  3.  
  4. const testedClassDependencyMock = jest.fn<TestedClassDependency>(() => ({
  5. // implementation
  6. }));
  7.  
  8. it('Should throw an error when calling playSomethingCool',() => {
  9. const testedClass = new TestedClass(testedClassDependencyMock());
  10. });

testedClassDependencyMock()创建模拟对象实例TestedClassDependency可以是类,也可以是类型或接口

猜你在找的JavaScript相关文章