Jest是否支持ES6导入/导出?

P.B*_*key 34 ecmascript-6 jestjs babel-jest

如果我使用import/exportES6,那么我的所有测试都会失败并显示错误:

意外的保留字

我将我的测试对象转换为使用旧学校IIFY语法,突然我的测试通过了.或者,采用更简单的测试用例:

   var Validation = require('../src/components/validation/validation');//PASS
   //import * as Validation from '../src/components/validation/validation'//FAIL
Run Code Online (Sandbox Code Playgroud)

同样的错误.显然这里导入/导出存在问题.使用ES5语法重写我的代码只是为了让我的测试框架感到满意是不切实际的.

我有巴贝尔开玩笑.我尝试了github问题的各种建议.不行,到目前为止.

的package.json

 "scripts": {
    "start": "webpack-dev-server",
    "test": "jest"
  },
      "jest": {
        "testPathDirs": [
          "__tests__"
        ],
        "testPathIgnorePatterns": [
          "/node_modules/"
        ],
        "testFileExtensions": ["es6", "js"],
        "moduleFileExtensions": ["js", "json", "es6"]
      },
Run Code Online (Sandbox Code Playgroud)

babelrc

{
  "presets": ["es2015", "react"],
  "plugins": ["transform-decorators-legacy"]
}
Run Code Online (Sandbox Code Playgroud)

有没有解决这个问题?

Rad*_*uka 61

2020 年更新 - ECMAScript 模块 (ESM) 的本机支持


根据这个问题,有来自jest@25.4.0. 这样你就不必再使用 babel 了。在撰写此答案时 (05/2020),要激活您需要做三件简单的事情:

  • 确保不要import通过transform: {}在配置文件中设置来转换语句
  • node@^12.16.0 || >=13.2.0--experimental-vm-modules旗奔跑
  • 使用jest-environment-node或运行您的测试jest-environment-jsdom-sixteen

所以你的 Jest 配置文件至少应该包含以下内容:

export default {
    testEnvironment: 'jest-environment-node',
    transform: {}
    ...
};
Run Code Online (Sandbox Code Playgroud)

要设置--experimental-vm-modules标志,您必须按如下方式运行 Jest:

node --experimental-vm-modules node_modules/jest/bin/jest.js
Run Code Online (Sandbox Code Playgroud)

另请注意,在 Github 问题中,此方法尚不支持该jest对象。所以你可能需要手动导入它:

import {jest} from '@jest/globals'
Run Code Online (Sandbox Code Playgroud)

我希望这会在未来改变

  • `NODE_OPTIONS='--experimental-vm-modules' jest` 运行 jest 更干净一些 (12认同)
  • 要完成这项工作,要做的第四件事是:package.json 应包含 `"type": "module"` 以便 Node 将文件检测为 ESM,请参阅 https://nodejs.org/api/packages.html#packages_determining_module_system (5认同)
  • 我只需要节点 `v14.6.1` 和 jest `v26.6.3` 上的 `NODE_OPTIONS='--experimental-vm-modules' jest` 。没有配置。 (4认同)
  • 什么是“jest-environment-node”以及它与环境“node”有何不同? (3认同)
  • 这是一个将用于测试的测试环境。默认情况下是“jsdom”。您可以在此处找到更多信息 https://jestjs.io/docs/en/configuration#testenvironment-string (2认同)
  • 重要的是,本机支持目前**不**支持模拟 (2认同)
  • 我还必须将 `"type": "modules"` 添加到 `package.json` 的根目录中。请参阅 [有关 ES 模块的 Jest 文档](https://jestjs.io/docs/ecmascript-modules) 了解更多信息。 (2认同)

Pau*_*ica 32

根据对另一个问题的回答,这可以更简单:


唯一的要求是将您的test环境配置为Babel,并添加es2015转换插件:


步骤1:

将您的test环境添加到.babelrc项目的根目录中:

{
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

第2步:

安装es2015转换插件:

npm install --save-dev @babel/plugin-transform-modules-commonjs
Run Code Online (Sandbox Code Playgroud)

就是这样.Jest将自动从ES模块到CommonJS进行编译,而无需在内部通知您的jest属性的其他选项package.json.

  • 如果您不想使用.babelrc污染您的项目,则可以在package.json中的babel密钥下方添加env密钥。 (5认同)
  • 我相信最新的@ babel / plugin-transform-modules-commonjs`取代了`transform-es2015-modules-commonjs` (3认同)
  • 伙计,这让我永远!谢谢! (3认同)

Laz*_*ima 18

对于更新的配置,我正在使用 https://babeljs.io/setup#installation

选择 JEST 并高兴:

作为参考,当前配置:

npm install --save-dev babel-jest
Run Code Online (Sandbox Code Playgroud)

package.json文件中,进行以下更改:

{
  "scripts": {
    "test": "jest"
  },
  "jest": {
    "transform": {
      "^.+\\.jsx?$": "babel-jest"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

安装 babel 预设:

npm install @babel/preset-env --save-dev
Run Code Online (Sandbox Code Playgroud)

创建一个.babelrc文件:

{
  "presets": ["@babel/preset-env"]
}
Run Code Online (Sandbox Code Playgroud)

运行你的测试:

npm run test
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,谢谢! (3认同)

Cod*_*ity 9

在 中package.json,请像这样设置:"test": "node --experimental-vm-modules node_modules/.bin/jest"

应该不错!

  • 没有!不会做的!模拟将不起作用。 (4认同)