Тесты 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}'

PS https://github.com/TypeStrong/ts-node/issues/1007

это работает для меня

      "test": "mocha --require ts-node/register './src/test/**/*.ts'"

Наткнулся на ту же проблему и понял, что у меня есть только эти варианты, чтобы заставить ее работать.

  1. Понизить mochaверсия от 9.x.xк 8.3.0, как предложил @RemiX здесь , или
  2. Добавлять experimental-specifier-resolution=nodeс loader=ts-node/esmв твоей mocharc.node-optionкак предлагается в этом суть

надеюсь, это поможет

Другие вопросы по тегам