用 Jest 测试 Typescript 接口

Posted

技术标签:

【中文标题】用 Jest 测试 Typescript 接口【英文标题】:Testing Typescript Interface with Jest 【发布时间】:2018-07-26 14:26:46 【问题描述】:

下面是我的界面和测试文件。当我针对它运行代码覆盖率的玩笑测试时,它一直说第 1 行和第 2 行没有被测试覆盖。接口的代码覆盖率甚至是可能的吗?还是应该从覆盖率报告中排除任何接口?

index.tsx

export interface StoreState 
    languageName: string;
    enthusiasmLevel: number;

index.test.tsx

import  StoreState  from '../types';

it('has a languageName of "TypeScript"', () => 
    const state: StoreState =  languageName: 'TypeScript', enthusiasmLevel: 3 ;
    expect(state.languageName).toEqual('TypeScript');
);

it('has an enthusiasm level of 3', () => 
  const state: StoreState =  languageName: 'TypeScript', enthusiasmLevel: 3 ;
  expect(state.enthusiasmLevel).toEqual(3);
);

【问题讨论】:

【参考方案1】:

这是ts-jest (Issue #378) 的一个已知问题。项目所有者目前建议将接口文件排除在 Jest 覆盖范围之外:

kulshekhar 于 2018 年 1 月 1 日发表评论:

我认为在 ts-jest 中无法解决此问题。我仔细研究了这个问题,有两种方法可以获得预期的结果:

从覆盖范围中排除仅包含类型的文件 从仅包含类型的文件中添加和导出虚拟函数/变量

当 TypeScript 转译文件时,它不会将“纯类型”导入转换为 require 语句。这会导致 Jest 不会选择这些文件并将其传递给 ts-jest。

GeeWee 评论于 2018 年 1 月 2 日:

我认为我们不能排除仅包含类型的文件。我也认为这是一个错误修复,除非 jest 增加了变形金刚选择文件不在覆盖范围内的能力或类似的东西。

例如,您可以使用coveragePathIgnorePatterns 来排除基于仅包含类型的文件的命名约定的文件(例如,I 前缀后跟大写字母,例如“ISerializable”):


  "jest": 
    ...
    "coveragePathIgnorePatterns": [
      "**/I[A-Z]*.ts"
    ]
  

【讨论】:

对我来说,我需要使用以下正则表达式:“src/*/I[A-z]*.ts”。双 '*' 导致错误。

以上是关于用 Jest 测试 Typescript 接口的主要内容,如果未能解决你的问题,请参考以下文章

用 Jest 和 Typescript 模拟一个全局对象

用 Jest 测试 Vuejs 和 TypeScript 会导致错误“Property 'xxx' does not exist on type 'CombinedVueInstance'

使用 React、Typescript 和 ES6 进行 Jest 测试

如何使用 vscode 设置 jest typescript 测试以在调试模式下运行

使用Jest测试原生TypeScript项目

使用 .ts 文件 (TypeScript) 配置 Jest 全局测试设置