Тесты Mocha с поддержкой esm для собственных модулей ES6
Есть отличный пост " Тестирование собственных модулей ES с использованием Mocha и ESM" Алекса Гибсона. Спасибо ему.
Я пробовал использовать мокко с поддержкой собственных модулей ES в своем проекте, и у меня было 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)
...
$ /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)
...
5 ответов
Из того, что я узнал за последние 2 часа:
package.json
{
"type": "module"
}
tsconfig.json
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "node",
}
}
.mocharc.json
{
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"
]
}
ОБНОВЛЕНИЕ: я думаю, что причина ошибки - конфликт между
--require esm
вариант в
mocha
аргументы и другие методы указания, что источники являются модулями ES6 (*.mjs
или же
type
вариант в
package.json
). Мои текущие тесты
.mjs
расширения, и та же ошибка возникает без
"type": "module"
в
package.json
старый персонал
Я искал причину, и это причина - моя собственная
package.json
:
"type": "module"
Примечание от nodejs.org:
Node.js по умолчанию обрабатывает код JavaScript как модули CommonJS. Авторы могут указать Node.js обрабатывать код JavaScript как модули ECMAScript с помощью расширения файла.mjs, поля "type" package.json или флага --input-type.
Просто удали
"type": "module"
от твоего
package.json
и
mocha
будет проводить тесты с
esm
поддержка, как описано в сообщении Алекса Гибсона.
Это мое тестовое репо с кодом, который нужно попробовать: https://github.com/flancer64/so_mocha_esm
Я нашел решение после бесчисленного количества экспериментов и поисков DuckDuckGo :)
mocha --loader=ts-node/esm 'test/**/*.{ts,js}'
это работает для меня
"test": "mocha --require ts-node/register './src/test/**/*.ts'"
Наткнулся на ту же проблему и понял, что у меня есть только эти варианты, чтобы заставить ее работать.
- Понизить
mocha
версия от9.x.x
к8.3.0
, как предложил @RemiX здесь , или - Добавлять
experimental-specifier-resolution=node
сloader=ts-node/esm
в твоейmocharc.node-option
как предлагается в этом суть
надеюсь, это поможет