typescript - 是什么导致 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 报告如下所示: 请注意,如果我按 n 或 j,则没有任何变化。
我一直在研究这个,似乎它可能与 Babel 生成的 esmodule 胶水代码有关,但是我不知道如何解决这个问题。
如果您需要更多信息,请发表评论。任何帮助将不胜感激。
解决方案
经过很长时间试图找出问题所在,我得出了以下答案。
基本上,我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",
推荐阅读
- postgresql - 序列存在,但我在 information_schema.sequences (PostgreSQL) 中找不到它
- javascript - 购买物品时出现未处理的拒绝 Opensea 错误
- go - go tool pprof list -- 错过的源代码行
- mysql - 使用庞大的地址数据库进行自动建议的最佳方式是什么?
- xquery - 如何更新 xquery marklogic 中的节点/元素
- c# - ASP.NET核心如何让前端的两个按钮与模型去不同的功能?
- websocket - 如何将语音流 websocket(目标是 Google Voice API)连接到 Twimlets 会议
- c# - 如何使用 HttpClient 实现 LogLevel 以抑制默认信息日志记录
- php - 如何使我的 apache Web 服务器公开而不是本地 Wi-Fi?
- c++ - 在 QT 中使用生成的旋转框编辑矢量