如何在 2023 年为 ESM 代码设置具有 Instanbul 覆盖率的 Mocha?

How to set up Mocha with Instanbul coverage for ESM code in 2023?

提问人:Michael Jonker 提问时间:10/22/2023 最后编辑:Michael Jonker 更新时间:10/23/2023 访问量:45

问:

我快剃完一头牦牛了,但这个让我难住了......

我的代码库和测试是 ES6 代码。所有测试都通过 Mocha 按预期运行,但我无法获得覆盖率。我得到的只是:

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |       0 |        0 |       0 |       0 |                   
----------|---------|----------|---------|---------|-------------------

我的环境是 Node v16.16.0

我以前一直在使用 mocha 扩展直接在我的打字稿代码上运行测试,这产生了覆盖率,直到当我尝试使用 commonJs 模块依赖项编译为 ES6 时事情变得复杂。这在一定程度上是我想完全绕过并在编译的 ES6 代码上运行覆盖测试的原因。(更少的怪癖,更接近现实世界的最终结果)ts-nodets-node

为了排除,所有源映射都已关闭,因此测试和源文件是纯 ES6 文件,不会分心。

我遵循了几个地方的指导:

所有这些都导致了以下配置;

// package.json
"type": "module",
"scripts": {
    "test": "NODE_ENV=test nyc mocha"
},
"devDependencies": {
    "@babel/core": "^7.23.2",
    "@babel/preset-env": "^7.23.2",
    "@babel/register": "^7.22.15",
    "@istanbuljs/nyc-config-babel": "^3.0.0",
    "babel-plugin-istanbul": "^6.1.1",
    "mocha": "^10.2.0",
    "nyc": "^15.1.0",
}
// .nycrc.json
{
    "extends": "@istanbuljs/nyc-config-babel",
    "all": true,
    "include": ["./dist/backend/src/**/*.js"], //my ES6 source files
    "reporter": ["text"],
}
// .mocharc.json
{
    "file": "test/compiled/tests.backend.spec.js", // my ES6 test suite file
    "require": ["@babel/register"]
}
// .babelrc
{
    "presets": ["@babel/preset-env"],
    "plugins": ["istanbul"]
}

---------------------------更新

我将所有 ES6 代码复制到新的工作目录中,并将其重建为一个新的、最小的 npm 包。

然后,上述配置确实按预期运行。

回到我的 monorepo 和牦牛剃须,事情立即又变得复杂了。

作为健全性检查,我安装了 c8 原生 V8 代码覆盖率,事情“刚刚开始”。这降低了 PEBCAK.

我得到的最接近的是想要注册一个文件,但出错了;nyc

unknown: import.meta may appear only with 'sourceType: "module"' (5:35)
Consider renaming the file to '.mjs', or setting sourceType:module or sourceType:unambiguous in your Babel config for this file.

  3 | import * as fs from 'fs';
  4 | import { log, config } from '../../typedox.mjs';
> 5 | const __filename = log.getFilename(import.meta.url);

这种情况甚至在之后仍然存在;

  • 将所有文件重命名为 ,.mjs
  • 有和没有 package.json"type":"module"
  • 设置或在 .babelrcsourceType:modulesourceType:unambiguous
  • 设置.nycrc.json"instrument": false

我会坚持使用 c8,因为这对我有用。我已经竭尽全力让纽约市本地人通过 monorepo 通过 babel 工作,但也许其他人可以在这里为后代回答。

JavaScript 测试 Mocha.js 代码覆盖 率 纽约

评论


答: 暂无答案