我正在使用Jest来测试我的React应用。
最近,我在我的应用中添加了DeckGL。我的测试因此错误而失败:
Test suite failed to run
/my_project/node_modules/deck.gl/src/react/index.js:21
export {default as DeckGL} from './deckgl';
^^^^^^
SyntaxError: Unexpected token export
at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:318:17)
at Object.<anonymous> (node_modules/deck.gl/dist/react/deckgl.js:9:14)
at Object.<anonymous> (node_modules/deck.gl/dist/react/index.js:7:15)
这似乎是Jest在运行它的测试之前转换节点模块的问题。
这是我的.babelrc:
{
"presets": ["react", "es2015", "stage-1"]
}
这是我的开玩笑设置:
"jest": {
"testURL": "http://localhost",
"setupFiles": [
"./test/jestsetup.js"
],
"snapshotSerializers": [
"<rootDir>/node_modules/enzyme-to-json/serializer"
],
"moduleDirectories": [
"node_modules",
"/src"
],
"moduleNameMapper": {
"\\.(css|scss)$": "<rootDir>/test/EmptyModule.js"
}
},
我似乎有正确的事情来转变export {default as DeckGL }
。所以任何想法都会出错?
答案 0 :(得分:11)
这是因为Node.js无法处理ES6模块。
因此,您应该将模块转换为CommonJS。
如果您使用Babel 7 =&gt;
安装
npm install --save-dev @babel/plugin-transform-modules-commonjs
仅用于测试用例添加到.babelrc, Jest自动给出NODE_ENV = test全局变量。
"env": {
"test": {
"plugins": ["@babel/plugin-transform-modules-commonjs"]
}
}
或者如果您使用Babel 6 =&gt;
npm install --save-dev babel-plugin-transform-es2015-modules-commonjs
到.babelrc
"env": {
"test": {
"plugins": ["transform-es2015-modules-commonjs"]
}
}
答案 1 :(得分:7)
这意味着,文件不会通过TypeScript编译器进行转换,例如因为它是带有TS语法的JS文件,或者作为未编译的源文件发布到npm。这就是你能做的。
调整transformIgnorePatterns
白名单:
{
"jest": {
"transformIgnorePatterns": [
"node_modules/(?!@ngrx|(?!deck.gl)|ng-dynamic)"
]
}
}
默认情况下,Jest不会转换node_modules,因为它们应该是有效的JavaScript文件。但是,图书馆作者认为你会编译他们的资源。所以你必须明确告诉Jest。上面的片段意味着@ngrx,deck和ng-dynamic将被转换,即使它们是node_modules。
答案 2 :(得分:3)
如果您使用的是'create-react-app',则不允许您通过 package.json 中的Jest属性指定'transformIgnorePatterns' >
按照此https://github.com/facebook/create-react-app/issues/2537#issuecomment-390341713
您可以在 package.json 中使用以下CLI进行覆盖,并且可以使用它:
"scripts": {
"test": "react-scripts test --transformIgnorePatterns \"node_modules/(?!your-module-name)/\"",
},
答案 3 :(得分:2)
默认情况下,Jest不会编译node_modules
目录中的文件。
transformIgnorePatterns [array]
默认值:[&#34; / node_modules /&#34;]
与所有源匹配的正则表达式模式字符串数组 转换前的文件路径。如果测试路径与任何一个匹配 模式,它不会被转换。默认:[&#34; / node_modules /&#34;]
DeckGL似乎在ES6中,为了使jest能够读取它,你也需要编译它。
要做到这一点,只需在transformignorePatterns
"transformIgnorePatterns": ["/node_modules/(?!deck\.gl)"]
https://facebook.github.io/jest/docs/en/configuration.html#transformignorepatterns-array-string
答案 4 :(得分:1)
我在使用 monorepo 时遇到了这个问题。根目录 node_modules
中的一个包破坏了我的测试。我通过将本地 .babelrc
文件更改为 babel.config.js
进行了修复。解释:https://github.com/facebook/jest/issues/6053#issuecomment-383632515