提问人:Michael Jonker 提问时间:10/22/2023 最后编辑:Michael Jonker 更新时间:10/23/2023 访问量:45
如何在 2023 年为 ESM 代码设置具有 Instanbul 覆盖率的 Mocha?
How to set up Mocha with Instanbul coverage for ESM code in 2023?
问:
我快剃完一头牦牛了,但这个让我难住了......
我的代码库和测试是 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-node
ts-node
为了排除,所有源映射都已关闭,因此测试和源文件是纯 ES6 文件,不会分心。
我遵循了几个地方的指导:
- 伊斯坦布尔纽约市,它指向我;
- babel-plugin-Istanbul,它指示我配置 Mocha;
- 摩卡的巴别塔
所有这些都导致了以下配置;
// 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"
- 设置或在 .babelrc 中
sourceType:module
sourceType:unambiguous
- 设置.nycrc.json
"instrument": false
我会坚持使用 c8,因为这对我有用。我已经竭尽全力让纽约市本地人通过 monorepo 通过 babel 工作,但也许其他人可以在这里为后代回答。
答: 暂无答案
评论