Jest:无法在模块外部使用import语句

26

在使用Jest运行测试时,我遇到了一个错误,我试图花了两个小时来修复这个错误。但是,我无法解决它。我的模块正在使用gapi-script包,而错误发生在这个包中。然而,我不知道为什么会出现这个错误以及如何解决它。

jest.config.js

module.exports = {
  "collectCoverage": true,
  "rootDir": "./",
  "testRegex": "__tests__/.+\\.test\\.js",
  "transform": {
    '^.+\\.js?$': "babel-jest"
  },
  "moduleFileExtensions": ["js"],
  "moduleDirectories": [
    "node_modules",
    "lib"
  ]
}
babel.config.js
module.exports = {
  presets: [
    '@babel/preset-env',
  ]
};

methods.test.js

import methods, { typeToActions } from '../lib/methods';

方法.js

import { gapi } from "gapi-script";
...

错误信息

C:\haram\github\react-youtube-data-api\node_modules\gapi-script\index.js:1 ({"Object.":function(module,exports,require,__dirname,__filename,global,jest){import { gapi, gapiComplete } from './gapiScript';

SyntaxError: Cannot use import statement outside a module
我的设置出了什么问题?

也许你可以在这里阅读评论。https://github.com/facebook/jest/issues/9292#issuecomment-569673251 - Tong
你尝试在测试中导入包了吗?或者模拟 gapi 函数?我认为你需要进行模拟。 - Lucas Andrade
5个回答

17

截至目前,Jest正在提供对ES6模块的支持。您可以在此处跟踪进展:

https://jestjs.io/docs/en/ecmascript-modules

目前,您可以通过运行以下命令来消除此错误:

node --experimental-vm-modules node_modules/.bin/jest

简单来说:

jest

在使用此解决方案之前,请务必检查链接。


1
这太重要了!我花了太长时间寻找这个解决方案。所有的测试都是正常的,然后我写了几个小时的代码,结果一切都失败了。找到了很多关于如何更新配置文件以使事情通过的文档 - 尝试了一段时间但失败了,然后找到了这个。 - nycynik
1
这太棒了。非常感谢您节省了数小时的无用交流! - Robert Moskal
命令返回错误:basedir=$(dirname "$(echo "$0" | sed -e 's,\,/,g')") ^^^^^^^语法错误:参数列表后缺少 ) - Julius Goddard

8

在 Paulo Coghi 对另一个问题的回答的帮助下,我解决了这个问题 -

Jest 是否支持 ES6 的 import/export?

步骤 1:

将测试环境添加到项目根目录下的 .babelrc 中:

{
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  }
}

步骤2:

安装ECMAScript 6转换插件:

npm install --save-dev @babel/plugin-transform-modules-commonjs

1
这适用于VenillaJs,谢谢。 - Andy Li
无法独立使用于 TypeScript。 - BobtheMagicMoose
使用 Jest 29 版本,这个不起作用。 - Ste

6
Jest需要babel与模块配合使用。仅进行测试时,您不需要jest.config.js,只需将测试文件命名为xxx.spec.js或xxx.test.js,或将文件放在名为test的文件夹中即可。
我使用这个babel.config.js:
module.exports = function (api) {
  api.cache(true)

  const presets = [
    "@babel/preset-env"
  ]

  return {
    presets
  }
}

在设置不太复杂的情况下,将"type": "module"添加到package.json中或使用其他答案中提到的mjs并不是必需的。

2

我也遇到了同样的问题,通过将以下命令行选项添加为环境变量来解决了该问题。

export NODE_OPTIONS=--experimental-vm-modules npx jest    //linux

setx NODE_OPTIONS "--experimental-vm-modules npx jest"    //windows

0

将 Jest(package.json)升级到版本29(目前最新版本)解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接