我正在尝试通过我的webpack项目设置Jest。当我运行测试时,Jest抱怨说它无法读取es6代码。 Babel似乎无法转换我的测试文件。
我尝试了各种在Internet上找到的解决方案,但仍然感到困惑。也许其他人具有更多的Babel / Webpack知识可以查看我的配置并帮助我。
相关的package.json脚本:
{
"test": "jest --no-cache --config config/jest.config.js"
}
相关的package.json deps:
"@babel/core": "^7.2.2",
"@babel/plugin-proposal-class-properties": "^7.3.0",
"@babel/preset-env": "^7.3.1",
"@babel/preset-flow": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"babel-eslint": "^10.0.1",
"babel-jest": "^24.0.0",
"babel-loader": "^8.0.5",
"babel-plugin-styled-components": "^1.10.0",
"jest": "^24.0.0",
"webpack": "^4.29.0",
"webpack-cli": "^3.2.1",
"webpack-dev-server": "^3.1.14"
config / webpack.config.js:
entry: './src/index.js',
mode: isProduction ? 'production' : 'development',
devtool: isProduction ? 'none' : 'inline-source-map',
bail: true,
devServer: {
contentBase: 'build',
compress: true,
port: 3000,
},
output: {
path: path.resolve(__dirname, 'build'),
filename: '[name].[chunkhash].js',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
'@babel/preset-env',
'@babel/preset-react',
'@babel/preset-flow',
],
plugins: [
'babel-plugin-styled-components',
'@babel/plugin-proposal-class-properties',
],
},
},
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html',
}),
new webpack.DefinePlugin({
'process.env': JSON.stringify(process.env),
}),
],
config / jest.config.js
module.exports = {
verbose: true,
rootDir: '../',
setupFiles: ['./config/jest.setup.js'],
transform: {
'^.+\\.js?$': 'babel-jest',
},
config / jest.setup.js
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
开玩笑的错误: ●测试套件无法运行
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
...
Details:
/<...projectpath>/config/jest.setup.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Enzyme from 'enzyme';
^^^^^^
SyntaxError: Unexpected token import
我想要一些工作正常的测试跑步者!我正在猜测我的转换:babel-jest在我的jest.config.js中什么也没做...
答案 0 :(得分:3)
您需要做两件事:
创建Babel配置文件(babel.config.js
):
这是必要的,因为babel-jest
依赖于传统的Babel配置文件,而不是webpack。从版本7开始,Babel支持babel.config.js
的JS配置。
使用JS Babel配置时(例如,与.babelrc
相对),Jest还会在node_modules
中编译模块。按照惯例,AFAIK必须位于项目的根目录中,并附带jest配置文件。
这是一个基于webpack.config.js
文件中的Babel选项的配置:
// babel.config.js
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-react',
'@babel/preset-flow',
],
plugins: [
'babel-plugin-styled-components',
'@babel/plugin-proposal-class-properties',
]
}
安装babel-core
网桥版本:
npm install babel-core@7.0.0-bridge.0 --save-dev
来自github.com/babel/babel-bridge:
此存储库包含我们所谓的“桥接”程序包,该程序包旨在简化使用“ babel-core”作为Babel 6的对等依赖项的库的过渡。
Babel 7过渡到范围的问题是,如果软件包依赖Babel 6,则他们可能希望同时添加对Babel 7的支持。由于Babel 7将以@ babel / core而不是babel-core的形式发布,因此维护人员无法在不进行重大更改的情况下进行该过渡。例如
答案 1 :(得分:1)
我遇到了类似的情况,我想用 jest 测试 React 组件 .js
文件,但它失败了,因为该组件导入了 .css
样式表。我在 Webpack 中使用 Babel。
根据接受的答案@sdgluck,我必须添加一个 babel.config.js
:
1.
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react']
};
2.我还安装了 babel-jest
作为开发依赖项
3.然后我通读了jest webpack guide
4. 这促使我在模拟文件和样式表的 package.json
中添加了一个“jest”属性:
"jest": {
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
}
}
5. 然后我必须在指定的路径创建模拟文件(你可以使用任何你想要的路径,那些只是来自他们的文档):
// __mocks__/styleMock.js
module.exports = {};
// __mocks__/fileMock.js
module.exports = 'test-file-stub';
然后它起作用了:)
答案 2 :(得分:0)
我有一些有用的信息,可供以后看到此问题的人参考。
默认情况下,笑话配置中的 transformIgnorePatterns 是["/node_modules/", "\.pnp\.[^\/]+$"]
如果某些问题是由 node_modules中的某些代码引起的,并且没有覆盖此值,则babel-jest仍然无法正常工作。
也许是像这样的正确值“ / node_modules /(?!(您的Third-part-es-module-code | others-es-lib))”