Протестируйте приложение Node.js с помощью Mocha, включая ES6-модули в зависимостях

Я хочу протестировать свое простое приложение Node.js (v14.15.4) с помощью Mocha (v8.2.1). Я также включаю Babel для компиляции модулей ES6 в свой код.

В частности, я использую "@babel/core" (v7.12.10), "babel/register" (v7.12.10) использовать компилятор с мокко, и "@babel/preset-env" (v7.12.11) для поддержки модуля ES6.

Все работает нормально, пока я не включу в свой код внешнюю зависимость. В моем случае я хочу использовать bpmn-js (v8.2.0)который сам готов к использованию с модулями ES6 (https://bpmn.io/blog/posts/2018-migrating-to-es-modules.html).

Структура моего проекта следующая:

      - bpmn
    - index.js
- node_modules
    - ...
- babel.config.json
- index.js
- index.test.js
- package.json

Файлы изображены ниже:

package.json

      {
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha --require @babel/register index.test.js"
  },
  "devDependencies": {
    "mocha": "8.2.1",
    "@babel/core": "7.12.10",
    "@babel/register": "7.12.10",
    "@babel/preset-env": "7.12.11"
  },
  "dependencies": {
    "bpmn-js": "8.2.0"
  },
  "author": "",
  "license": "ISC"
}

babel.config.json

      {
    "presets": ["@babel/preset-env"]
}

index.js

      export {
    default
  } from './bpmn';

bpmn / index.js

      //import { Viewer } from 'bpmn-js';

export default (str) => {
    return str.toUpperCase();
};

index.test.js

      import toUpperCase from './index';

const assert = require('assert');

describe('The module toUpperCase', () => {
  it('should transform my test string', () => {
    assert.strictEqual(toUpperCase('test'), 'TEST');
  });
});

Как сказано, при запуске все работает нормально npm run test. Однако, если я включу комментарий в строку 1 файла bpmn / index.js , произойдет ошибка, указанная ниже. Кажется, что babel компилирует мои локальные файлы проекта, но игнорирует внешние зависимости, т.е. bpmn-js в этом случае

      \node_modules\bpmn-js\index.js:1
export {
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\bpmn\/index.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\/index.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\/index.test.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.exports.requireOrImport (D:\Code\Neuer Ordner\node_modules\mocha\lib\esm-utils.js:20:12)
    at Object.exports.loadFilesAsync (D:\Code\Neuer Ordner\node_modules\mocha\lib\esm-utils.js:33:34)
    at Mocha.loadFilesAsync (D:\Code\Neuer Ordner\node_modules\mocha\lib\mocha.js:431:19)
    at singleRun (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run-helpers.js:125:15)
    at exports.runMocha (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run-helpers.js:190:10)
    at Object.exports.handler (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run.js:362:11)
    at D:\Code\Neuer Ordner\node_modules\yargs\lib\command.js:241:49

1 ответ

В вашем подходе есть две проблемы. Первый, действительно фундаментальный, заключается в том, что вы пытаетесь импортировать bpmn-js внутри процесса Node.js. Этот пакет можно запустить только в браузере, так как это зависит от доступности документа DOM . Вы никогда не сможете этого сделать. Другая проблема, как вы правильно поняли, в том, что bpmn-js использует синтаксис модуля ES6. По умолчанию пакеты, найденные в каталоге node_modules , игнорируются нужной вам командой @babel / register. Другими словами, они не передаются. Вы можете настроить @babel / register, чтобы сделать исключение для bpmn-js и перенести его, но ваш импорт все равно завершится ошибкой с чем-то вроде:

      ReferenceError: document is not defined
Другие вопросы по тегам