Mocha 测试对原生 ES6 模块的“esm”支持

Ale*_*sev 7 javascript mocha.js ecmascript-6 es6-modules esm

Alex Gibson 有一篇很棒的文章“使用 Mocha 和 esm 测试原生 ES 模块”。谢谢他。

我尝试在我的项目中使用带有原生 ES 模块支持的 mocha,但我遇到了 2 个不同的错误:

$ ./node_modules/mocha/bin/mocha --require esm './test/Util.test.js'

TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified.
    at exports.importModuleDynamicallyCallback (internal/process/esm_loader.js:41:9)
    at formattedImport (/.../node_modules/mocha/lib/esm-utils.js:6:23)
    at Object.exports.requireOrImport (/.../node_modules/mocha/lib/esm-utils.js:23:14)
    at Object.exports.loadFilesAsync (/.../node_modules/mocha/lib/esm-utils.js:33:34)
    at Mocha.loadFilesAsync (/.../node_modules/mocha/lib/mocha.js:427:19)
    ...
Run Code Online (Sandbox Code Playgroud)
$ /usr/bin/node /.../node_modules/mocha/bin/mocha -r esm --ui bdd --reporter \ 
  /.../PhpStorm/plugins/NodeJS/js/mocha-intellij/lib/mochaIntellijReporter.js \ 
  /.../test/Util.test.js

TypeError: Invalid host defined options
    at formattedImport (/.../node_modules/mocha/lib/esm-utils.js:6:23)
    at Object.exports.requireOrImport (/.../node_modules/mocha/lib/esm-utils.js:23:14)
    at Object.exports.loadFilesAsync (/.../node_modules/mocha/lib/esm-utils.js:33:34)
    at Mocha.loadFilesAsync (/.../node_modules/mocha/lib/mocha.js:427:19)
    ...
Run Code Online (Sandbox Code Playgroud)

red*_*dia 11

根据我过去2小时了解到的情况:

包.json

{
    "type": "module"
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
    "compilerOptions": {
        "module": "esnext",
        "moduleResolution": "node",
    }
}
Run Code Online (Sandbox Code Playgroud)

.mocharc.json

{
    "node-option": [
        "experimental-specifier-resolution=node",
        "loader=ts-node/esm"
    ]
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*sev 5

更新:我认为错误的原因是参数中的--require esm选项mocha与指示源是 ES6 模块(*.mjs或中的type选项package.json)的其他方法之间的冲突。我当前的测试有.mjs扩展,并且在没有"type": "module"in 的情况下发生了相同的错误package.json

老员工

我查了一下原因,这就是原因——我自己的package.json

"type": "module"
Run Code Online (Sandbox Code Playgroud)

来自nodejs.org 的注释

默认情况下,Node.js 将 JavaScript 代码视为 CommonJS 模块。作者可以通过 .mjs 文件扩展名、package.json“type”字段或 --input-type 标志告诉 Node.js 将 JavaScript 代码视为 ECMAScript 模块。

如 Alex Gibson 的帖子中所述,只需"type": "module"从您的package.jsonmocha将运行esm支持的测试中删除即可。

这是我的测试存储库,其中包含要尝试的代码:flancer64/so_mocha_esm

  • 我无法删除 `"type": "module"`,因为我实际上想生成 ESM 模块作为最终产品。我也在 TypeScript 中工作,到目前为止没有运气尝试让 mocha、ts-node、esm 和/或 `--experimental-specifier-resolution` 标志愉快地一起工作。 (2认同)
  • 即使没有“type”:“module”,我也遇到了同样的问题。将 Mocha 从版本 9.xx 降级到 8.3.0 解决了该问题。 (2认同)

小智 2

这对我有用

"test": "mocha --require ts-node/register './src/test/**/*.ts'"
Run Code Online (Sandbox Code Playgroud)