javascript Jest es6模块:意外的模块导入

wfypjpf4  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(181)

我正在尝试测试一个需要导入es6模块的文件,如下所示:
https://repl.it/HG9t/0
看来我错过了一些配置,使它正常工作。
如果你能用另一个单元测试框架轻松地实现这一点,我也很感兴趣。
预先感谢你的帮助。

kq4fsx7k

kq4fsx7k1#

1.安装所需的依赖项:
yarn add --dev babel-jest @babel/core @babel/preset-env

npm install --save-dev babel-jest @babel/core @babel/preset-env
1.在您的主文件夹中创建babel.config.js并粘贴到那里:

// babel.config.js
module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        targets: {
          node: 'current',
        },
      },
    ],
  ],
};

1.确保package.jsonjest.config.js中的所有jest设置都设置为默认值。

dsekswqp

dsekswqp2#

由于节点不支持模块,你必须使用Babel来编译你的文件。看看如何配置Jest和Babel的文档

gwbalxhn

gwbalxhn3#

我有一个类似的问题与npm包'rgb-hex'和'hex-rgb',因为他们的主要出口是在ES6格式。我使用了一个Typescript项目与Jest。我认为错误来自Jest结束,而不是Typescript,因为Jest在正确翻译的javascript上工作(根据它自己的配置)。根本问题是这些ES6风格的主导出会导致Jest出现问题(不是tsc或Typescript链),因为你需要告诉Jest去transile。
我使用包“ts-jest”找到了一个可用的配置,基于简单的预设(唯一需要注意的是忽略模式),具有以下配置:
tsconfig.json:

{
    "compilerOptions": {
      "esModuleInterop": true,
      "module": "es2020",
      "moduleResolution": "nodenext",
      "forceConsistentCasingInFileNames": true,
      "strict": true,
      "skipLibCheck": true,
      "rootDir": "./",
      "allowJs": true
    },
    "ts-node": {
        "esm": true
    },
    "include": ["./ts-src/**/*"]
  }

jest.config.cjs

module.exports = {
  verbose: true,
  preset: 'ts-jest/presets/js-with-babel-esm',
  testEnvironment: 'node',
  transformIgnorePatterns: ['/node_modules/(?!(hex\-rgb|rgb\-hex)/)']
};

注意:根据“ts-jest”的文档,在你想要使用esm的时候,预设设置是很重要的。
cjs(完全是香草味的,但包括在内,我认为是必要的)

module.exports = {
    presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
  };

请注意node_modules中的忽略模式。您在regex中使用了否定运算和分组来告诉它“除了这些特定的包模式之外,是的,忽略node_modules以进行传输”。Jest中出现这种忽略模式的原因是node_modules中的包通常不使用来自其主文件index.js文件的ES6导出Jest通常不会转换它们,因为那样的话它就必须扫描所有的node_modules,所以你可以使用这些忽略模式(带有一些违反直觉的正则表达式)来转换node_modules中的特定内容。
编辑:.cjs扩展名是因为我的整个项目使用的是package.json中的"type": "module"。如果你把这些文件保留为.js,你会得到一个非常描述性的错误。.cjs扩展名告诉Node放松,只使用他们框架使用的当前规范格式的配置(这不是ES6... lol JS永远不会改变)

相关问题