Jest给出了一个错误:#34; SyntaxError:意外的令牌导出"

时间:2018-03-13 18:31:13

标签: jestjs

我正在使用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 }。所以任何想法都会出错?

5 个答案:

答案 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

中为DeckGL添加一个例外
"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