首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用包含ES6-模块的Mocha测试Node.js应用程序

用包含ES6-模块的Mocha测试Node.js应用程序
EN

Stack Overflow用户
提问于 2021-02-03 17:38:07
回答 1查看 200关注 0票数 2

我想用Mocha (v8.2.1)测试我的简单的Node.js (v14.15.4)应用程序。我还包括Babel来编译代码中的ES6模块。

特别是,我使用"@babel/core" (v7.12.10)"babel/register" (v7.12.10)来使用带有mocha的编译器,并使用"@babel/preset-env" (v7.12.11)来支持ES6模块。

一切都很好,直到我在代码中包含了一个外部依赖。在我的例子中,我希望使用bpmn-js (v8.2.0),它本身就可以与ES6模块(https://bpmn.io/blog/posts/2018-migrating-to-es-modules.html)一起使用了。

我的项目结构如下:

代码语言:javascript
复制
- bpmn
    - index.js
- node_modules
    - ...
- babel.config.json
- index.js
- index.test.js
- package.json

这些文件如下所示:

package.json

代码语言:javascript
复制
{
  "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

代码语言:javascript
复制
{
    "presets": ["@babel/preset-env"]
}

index.js

代码语言:javascript
复制
export {
    default
  } from './bpmn';

bpmn/index.js

代码语言:javascript
复制
//import { Viewer } from 'bpmn-js';

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

index.test.js

代码语言:javascript
复制
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时一切正常。但是,如果我将注释包含在bpmn/index.js文件的第1行中,则会出现以下错误。看来babel编译了我的本地项目文件,但是忽略了外部依赖项,即在这种情况下是bpmn-js

代码语言:javascript
复制
\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
EN

回答 1

Stack Overflow用户

发布于 2021-02-06 16:02:57

你的方法有两个问题。第一个非常基本的问题是,您正在尝试将bpmn导入到Node.js进程中。此包只能在浏览器中运行,因为它依赖于可用的DOM文档。你永远也做不到这一点。另一个问题是,正如您正确理解的那样,bpmn使用ES6模块语法。默认情况下,在node_modules目录中找到的包会被您所需的@babel/忽略。换句话说,他们没有被转移。您可以配置@babel/register为bpmn提供豁免,并对其进行transpile,但是您的导入仍然会失败,如下所示:

代码语言:javascript
复制
ReferenceError: document is not defined
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66032786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档