Jest 是否支持 ES6 import/export?
Does Jest support ES6 import/export?
如果我使用 ES6 中的 import/export
那么我所有的 Jest 测试都会失败并出现错误:
Unexpected reserved word
我将我的被测对象转换为使用旧式 IIFE 语法,突然我的测试通过了。或者,做一个更简单的测试用例:
var Validation = require('../src/components/validation/validation'); // PASS
//import * as Validation from '../src/components/validation/validation' // FAIL
同样的错误。显然这里的import/export有问题。仅仅为了让我的测试框架满意而使用 ES5 语法重写我的代码对我来说是不切实际的。
我有 babel-jest。我从 GitHub 问题中尝试了各种 suggestions。到此为止是不行的。
文件package.json
"scripts": {
"start": "webpack-dev-server",
"test": "jest"
},
"jest": {
"testPathDirs": [
"__tests__"
],
"testPathIgnorePatterns": [
"/node_modules/"
],
"testFileExtensions": ["es6", "js"],
"moduleFileExtensions": ["js", "json", "es6"]
},
文件babelrc
{
"presets": ["es2015", "react"],
"plugins": ["transform-decorators-legacy"]
}
有解决办法吗?
只需将 stage-0 添加到您的 .babelrc 文件即可。这是一个例子:
{
"presets": ["es2015", "react", "stage-0"],
"plugins": ["transform-decorators-legacy"]
}
除了安装 babel-jest
(Jest 现在默认自带)之外,一定要安装 regenerator-runtime
.
从到另一个问题,这个可以更简单:
唯一的要求是将您的 test
环境配置为 Babel,并添加 ECMAScript 6 转换插件:
第 1 步:
将您的 test
环境添加到项目根目录中的 .babelrc
:
{
"env": {
"test": {
"plugins": ["@babel/plugin-transform-modules-commonjs"]
}
}
}
第 2 步:
安装 ECMAScript 6 转换插件:
npm install --save-dev @babel/plugin-transform-modules-commonjs
就是这样。 Jest 将自动启用从 ECMAScript 模块到 CommonJS 的编译,而无需通知您的其他选项 jest
属性 里面 package.json
.
我遇到了同样的问题。
这些是我所做的:
yarn add --dev babel-jest @babel/core @babel/preset-env
在 rootDir.
中创建文件 jest.config.js
module.exports = {
moduleFileExtensions: ["js", "json", "jsx", "ts", "tsx", "json"],
transform: {
'^.+\.(js|jsx)?$': 'babel-jest'
},
testEnvironment: 'node',
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/'
},
testMatch: [
'<rootDir>/**/*.test.(js|jsx|ts|tsx)', '<rootDir>/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))'
],
transformIgnorePatterns: ['<rootDir>/node_modules/']
};
然后在rootDir.
中创建文件babal.config.js
这样走:
module.exports = {
"presets": ["@babel/preset-env"]
}
对于更新的配置,我正在使用 https://babeljs.io/setup#installation
Select开玩笑并开心:
作为参考,当前配置:
npm install --save-dev babel-jest
在您的 package.json 文件中,进行以下更改:
{
"scripts": {
"test": "jest"
},
"jest": {
"transform": {
"^.+\.jsx?$": "babel-jest"
}
}
}
安装 babel 预设:
npm install @babel/preset-env --save-dev
创建 .babelrc
文件:
{
"presets": ["@babel/preset-env"]
}
运行 你的测试:
npm run test
更新 2020 - 原生支持 ECMAScript 模块 (ESM)
根据 this issue,jest@25.4.0
提供了对 ESM 的原生支持。所以你不必再使用 babel 了。在撰写此答案时 (05/2020),要激活您需要做三件简单的事情:
- 通过在配置文件
transform: {}
中设置transform: {}
,确保您没有转换掉import
语句
- 运行
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: {}
...
};
要设置 --experimental-vm-modules
标志,您必须 运行 开玩笑如下:
node --experimental-vm-modules node_modules/jest/bin/jest.js
另请注意,在 Github 问题中,此方法尚不支持 jest
对象。所以你可能需要手动导入它:
import {jest} from '@jest/globals'
(希望以后会有所改变)
要添加对 React 和 react-testing-library 的支持,弹出 CreateReactApp 并从 package.json
中获取所有需要的 Jest 配置可能很有用。它已准备好与另一个捆绑器一起使用,在我的例子中是 Rollup。
在package.json
中,请这样设置:"test": "node --experimental-vm-modules node_modules/.bin/jest"
应该不错!
下面是我如何为我的项目设置 jest、typescript 和 ES 模块。
jest.config.js
/**
* @type {import('ts-jest/dist/types').InitialOptionsTsJest}
* To configure ESM support, see: https://kulshekhar.github.io/ts-jest/docs/guides/esm-support
*
**/
export default {
preset: 'ts-jest/presets/default-esm',
testEnvironment: 'node',
extensionsToTreatAsEsm: ['.ts'],
globals: {
'ts-jest': {
useESM: true
}
},
setupFiles: ['<rootDir>/__tests__/setup.ts'],
};
tsconfig.json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"outDir": "./dist",
"moduleResolution": "node",
// "strict": true,
"esModuleInterop": true,
"inlineSourceMap": true,
}
}
package.json
脚本和 devDependencies
"scripts": {
"start": "node ./dist/server.js",
"dev": "tsc-watch --onSuccess \"node ./dist/server.js\"",
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
},
"devDependencies": {
"@jest/globals": "^27.4.4",
"@types/express": "^4.17.13",
"@types/jest": "^27.4.0",
"@types/supertest": "^2.0.11",
"cross-env": "^7.0.3",
"supertest": "^6.2.1",
"ts-jest": "^27.1.3"
}
__tests__/setup.ts
import dotenv from 'dotenv';
dotenv.config({
path: './.env.test'
});
如果我使用 ES6 中的 import/export
那么我所有的 Jest 测试都会失败并出现错误:
Unexpected reserved word
我将我的被测对象转换为使用旧式 IIFE 语法,突然我的测试通过了。或者,做一个更简单的测试用例:
var Validation = require('../src/components/validation/validation'); // PASS
//import * as Validation from '../src/components/validation/validation' // FAIL
同样的错误。显然这里的import/export有问题。仅仅为了让我的测试框架满意而使用 ES5 语法重写我的代码对我来说是不切实际的。
我有 babel-jest。我从 GitHub 问题中尝试了各种 suggestions。到此为止是不行的。
文件package.json
"scripts": {
"start": "webpack-dev-server",
"test": "jest"
},
"jest": {
"testPathDirs": [
"__tests__"
],
"testPathIgnorePatterns": [
"/node_modules/"
],
"testFileExtensions": ["es6", "js"],
"moduleFileExtensions": ["js", "json", "es6"]
},
文件babelrc
{
"presets": ["es2015", "react"],
"plugins": ["transform-decorators-legacy"]
}
有解决办法吗?
只需将 stage-0 添加到您的 .babelrc 文件即可。这是一个例子:
{
"presets": ["es2015", "react", "stage-0"],
"plugins": ["transform-decorators-legacy"]
}
除了安装 babel-jest
(Jest 现在默认自带)之外,一定要安装 regenerator-runtime
.
从
唯一的要求是将您的 test
环境配置为 Babel,并添加 ECMAScript 6 转换插件:
第 1 步:
将您的 test
环境添加到项目根目录中的 .babelrc
:
{
"env": {
"test": {
"plugins": ["@babel/plugin-transform-modules-commonjs"]
}
}
}
第 2 步:
安装 ECMAScript 6 转换插件:
npm install --save-dev @babel/plugin-transform-modules-commonjs
就是这样。 Jest 将自动启用从 ECMAScript 模块到 CommonJS 的编译,而无需通知您的其他选项 jest
属性 里面 package.json
.
我遇到了同样的问题。
这些是我所做的:
yarn add --dev babel-jest @babel/core @babel/preset-env
在 rootDir.
中创建文件 jest.config.jsmodule.exports = {
moduleFileExtensions: ["js", "json", "jsx", "ts", "tsx", "json"],
transform: {
'^.+\.(js|jsx)?$': 'babel-jest'
},
testEnvironment: 'node',
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/'
},
testMatch: [
'<rootDir>/**/*.test.(js|jsx|ts|tsx)', '<rootDir>/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))'
],
transformIgnorePatterns: ['<rootDir>/node_modules/']
};
然后在rootDir.
中创建文件babal.config.js这样走:
module.exports = {
"presets": ["@babel/preset-env"]
}
对于更新的配置,我正在使用 https://babeljs.io/setup#installation
Select开玩笑并开心:
作为参考,当前配置:
npm install --save-dev babel-jest
在您的 package.json 文件中,进行以下更改:
{
"scripts": {
"test": "jest"
},
"jest": {
"transform": {
"^.+\.jsx?$": "babel-jest"
}
}
}
安装 babel 预设:
npm install @babel/preset-env --save-dev
创建 .babelrc
文件:
{
"presets": ["@babel/preset-env"]
}
运行 你的测试:
npm run test
更新 2020 - 原生支持 ECMAScript 模块 (ESM)
根据 this issue,jest@25.4.0
提供了对 ESM 的原生支持。所以你不必再使用 babel 了。在撰写此答案时 (05/2020),要激活您需要做三件简单的事情:
- 通过在配置文件
transform: {}
中设置transform: {}
,确保您没有转换掉import
语句 - 运行
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: {}
...
};
要设置 --experimental-vm-modules
标志,您必须 运行 开玩笑如下:
node --experimental-vm-modules node_modules/jest/bin/jest.js
另请注意,在 Github 问题中,此方法尚不支持 jest
对象。所以你可能需要手动导入它:
import {jest} from '@jest/globals'
(希望以后会有所改变)
要添加对 React 和 react-testing-library 的支持,弹出 CreateReactApp 并从 package.json
中获取所有需要的 Jest 配置可能很有用。它已准备好与另一个捆绑器一起使用,在我的例子中是 Rollup。
在package.json
中,请这样设置:"test": "node --experimental-vm-modules node_modules/.bin/jest"
应该不错!
下面是我如何为我的项目设置 jest、typescript 和 ES 模块。
jest.config.js
/**
* @type {import('ts-jest/dist/types').InitialOptionsTsJest}
* To configure ESM support, see: https://kulshekhar.github.io/ts-jest/docs/guides/esm-support
*
**/
export default {
preset: 'ts-jest/presets/default-esm',
testEnvironment: 'node',
extensionsToTreatAsEsm: ['.ts'],
globals: {
'ts-jest': {
useESM: true
}
},
setupFiles: ['<rootDir>/__tests__/setup.ts'],
};
tsconfig.json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"outDir": "./dist",
"moduleResolution": "node",
// "strict": true,
"esModuleInterop": true,
"inlineSourceMap": true,
}
}
package.json
脚本和 devDependencies
"scripts": {
"start": "node ./dist/server.js",
"dev": "tsc-watch --onSuccess \"node ./dist/server.js\"",
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
},
"devDependencies": {
"@jest/globals": "^27.4.4",
"@types/express": "^4.17.13",
"@types/jest": "^27.4.0",
"@types/supertest": "^2.0.11",
"cross-env": "^7.0.3",
"supertest": "^6.2.1",
"ts-jest": "^27.1.3"
}
__tests__/setup.ts
import dotenv from 'dotenv';
dotenv.config({
path: './.env.test'
});