首页 > 解决方案 > 是什么导致 Jest 在此代码中显示 75% 的分支覆盖率?

问题描述

我有一个文件,parsePredicate.ts我相信其中没有分支。然而,Jest 覆盖率报告说它只有 75% 的分支覆盖率。树枝在哪里?

parsePredicate.ts

import parseIdentifier from "../parseIdentifier/parseIdentifier";
import parseOperator from "../parseOperator/parseOperator";
import { parseExpression } from "../parseExpression/parseExpression";

const parsePredicate = (str: string)=>{
    let {identifier: left, rest:identRest} = parseIdentifier(str);
    let {operator, rest:opRest} = parseOperator(identRest);
    let {expression: right, rest:exprRest} = parseExpression(opRest);
    return { left: left, operator: operator, right: right, rest: exprRest };
}
export default parsePredicate;

parsePredicate.test.ts

import parsePredicate from "./parsePredicate";
import parseIdentifier from "../parseIdentifier/parseIdentifier";
import parseOperator from "../parseOperator/parseOperator";
import { parseExpression } from "../parseExpression/parseExpression";

jest.mock("../parseIdentifier/parseIdentifier");
jest.mock("../parseOperator/parseOperator");
jest.mock("../parseExpression/parseExpression");

test("Parsing a predicate with number returns proper values", ()=>{
    // @ts-ignore
    parseIdentifier.mockReturnValueOnce({identifier: "x", rest:" = 1"});
    // @ts-ignore
    parseOperator.mockReturnValueOnce({operator: "=", rest:" 1"});
    // @ts-ignore
    parseExpression.mockReturnValueOnce({expression: "1", rest:""});
    expect(parsePredicate("x = 1")).toStrictEqual({left:"x", operator:"=", right:"1", rest:""});
});
test("Parsing a predicate with math returns proper values", ()=>{
    // @ts-ignore
    parseIdentifier.mockReturnValueOnce({identifier: "x", rest:" = 1 + 1"});
    // @ts-ignore
    parseOperator.mockReturnValueOnce({operator: "=", rest:" 1 + 1"});
    // @ts-ignore
    parseExpression.mockReturnValueOnce({expression: "1 + 1", rest:""});
    expect(parsePredicate("x = 1 + 1")).toStrictEqual({left:"x", operator:"=", right:"1 + 1", rest:""});
});
test("Parsing a predicate with string returns proper values", ()=>{
    // @ts-ignore
    parseIdentifier.mockReturnValueOnce({identifier: "x", rest:" = 'Hello World'"});
    // @ts-ignore
    parseOperator.mockReturnValueOnce({operator: "=", rest:" 'Hello World'"});
    // @ts-ignore
    parseExpression.mockReturnValueOnce({expression: "'Hello World'", rest:""});
    expect(parsePredicate("x = 'Hello World'")).toStrictEqual({left:"x", operator:"=", right:"'Hello World'", rest:""});
});
test("Parsing a predicate with identifier returns proper values", ()=>{
    // @ts-ignore
    parseIdentifier.mockReturnValueOnce({identifier: "x", rest:" = ident"});
    // @ts-ignore
    parseOperator.mockReturnValueOnce({operator: "=", rest:" ident"});
    // @ts-ignore
    parseExpression.mockReturnValueOnce({expression: "ident", rest:""});
    expect(parsePredicate("x = ident")).toStrictEqual({left:"x", operator:"=", right:"ident", rest:""});
});

当我运行时jest --coverage,我的parsePredicate.ts文件得到以下输出:

---------------------|---------|----------|---------|---------|-------------------
File                 | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------------|---------|----------|---------|---------|-------------------
parsePredicate       |     100 |       75 |     100 |     100 |                   
  parsePredicate.ts  |     100 |       75 |     100 |     100 | 11   

如您所见,它表示第 11 行未覆盖。然而,第 11 行只是一个export声明:

export default parsePredicate;

lcov 报告如下所示: lcov 报告 请注意,如果我按 n 或 j,则没有任何变化。

我一直在研究这个,似乎它可能与 Babel 生成的 esmodule 胶水代码有关,但是我不知道如何解决这个问题。

如果您需要更多信息,请发表评论。任何帮助将不胜感激。

标签: typescriptunit-testingjestjs

解决方案


经过很长时间试图找出问题所在,我得出了以下答案。

基本上,我jest.config.js使用的是v8覆盖提供者。

// Indicates which provider should be used to instrument code for coverage
coverageProvider: "v8",

我使用的是节点版本 12.16.1,所以这个提供者不是很好并且有很多问题。

更改为babel提供程序解决了我遇到的所有问题,并为该代码提供了 100% 的分支覆盖率。

// Indicates which provider should be used to instrument code for coverage
coverageProvider: "babel",

推荐阅读