使用 Jest 测试 Typescript 接口

hol*_*ltc 5 typescript reactjs jestjs create-react-app

下面是我的界面和测试文件。当我针对它运行笑话测试以获取代码覆盖率时,它一直说测试未覆盖第 1 行和第 2 行。接口的代码覆盖率是否可能实现?或者我应该从覆盖率报告中排除任何接口?

index.tsx

export interface StoreState {
    languageName: string;
    enthusiasmLevel: number;
}
Run Code Online (Sandbox Code Playgroud)


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);
});
Run Code Online (Sandbox Code Playgroud)

ton*_*y19 6

ts-jest这是(问题#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}"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)