Babel 在运行 Jest 时不会编译 .test.js 文件

IT技术 reactjs testing babeljs jestjs
2021-05-21 14:31:57

在运行 yarn run jest --no-cache 时,会抛出一个错误:

SyntaxError: Unexpected token import

我最好的猜测是 babel 没有达到这个测试文件。我需要将它们包含在 .babelrc 中吗?

小路:

/src/tests/LandingPage.test.js

测试文件:

import React from 'react';
import ReactShallowRenderer from 'react-test-renderer/shallow';
import LandingPage from '../../components/LandingPage';

test('Should render LandingPage correctly', () => {
  const renderer = new ReactShallowRenderer();
  renderer.render(<LandingPage />);
  expect(renderer.getRenderOutput()).toMatchSnapshot();
});

.babelrc :

{
  "presets": [
    "env",
    "react"
  ],
  "plugins": [
    "transform-class-properties",
    "transform-object-rest-spread"
  ]
}
3个回答

感谢@hannad rehmann 朝正确方向推动这里是对我有用的解决方案。

安装 babel-jest

yarn add babel-jest --dev

为测试环境配置 .babelrc

Jest 会自动将您的环境设置为测试,因此将您想要的任何配置复制到测试环境中。

{
  "presets": [
    "env",
    "react"
  ],
  "plugins": [
    "transform-class-properties",
    "transform-object-rest-spread"
  ],
  "env": {
    "test": {
      "presets": [
        "env",
        "react"
        ],
      "plugins": [
        "transform-class-properties",
        "transform-object-rest-spread"
      ]
    }
  }
}

添加jest.config.json到项目根目录

{
  "transform": {
    "^.+\\.jsx?$": "babel-jest"
  }
}

最后,让您的测试脚本知道在哪里可以找到配置文件

我刚刚将它添加到 package.json 中的测试脚本中,但您也可以在命令行中运行它。

"scripts": {
    "test": "jest --config=jest.config.json --watch"
},

哦。这个问题让我浪费了很多天。这是您需要做的。在此之前检查这些文件。

1).babelrc安装相应的module并将它们添加到 package.json 定义不同的 env 支持,因为你的笑话总是更改NODE_ENV"test"

{
  "presets": [
    [
      "env",
      { "modules": false }],
    "react"
    ],
    "plugins": [
      "react-hot-loader/babel",
      "transform-object-rest-spread",
      "transform-class-properties",
      "dynamic-import-webpack"
    ],
  "env":{
    "test":{
      "presets": [
        "env",
        "react"
    ],
    "plugins": [
      "transform-object-rest-spread",
      "transform-class-properties",
      "dynamic-import-webpack"
    ]}
  }
}

2)将此添加到您的 package.json

 "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|scss)$": "<rootDir>/__mocks__/styleMock.js"
    },
    "automock": false,
    "transform": {
      "^.+\\.jsx?$": "<rootDir>/node_modules/babel-jest",
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js"
    },
    "moduleFileExtensions": [
      "js",
      "jsx"
    ],
    "moduleDirectories": [
      "node_modules"
    ],
    "unmockedModulePathPatterns": [
      "<rootDir>/node_modules/react/",
      "<rootDir>/node_modules/react-dom/"
    ],
    "transformIgnorePatterns": [
      "/node_modules/"
    ],
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ],
    "modulePathIgnorePatterns": [
      "/node_modules/"
    ],
    "collectCoverage": true,
    "coverageReporters": [
      "json",
      "lcov",
      "text"
    ]
     }

我对这个问题的理解是,Jest 会改变你的NODE_ENVto"test"而 Babel 没有这个 env 的任何配置,我们通常为开发和生产环境定义 Babel 配置。当没有 babel 转译时,import关键字实际上变成了undefined因为它实际上不存在于 JS 上下文中。

对于任何寻找解决方案的人来说,在我的情况下,问题是我出于某种原因NODE_ENV配置了环境变量development

现在JEST 只将 设置envtestifNODE_ENV尚未定义,否则它将使用 的值NODE_ENV这意味着如果您在您的.babelrcbabel.config文件中添加了专用部分test(如下所示),它将被忽略,而将使用默认值(或与您的 匹配的NODE_ENV)!

{
...
  "env": {
    "test": { presets: [ "@babel/preset-env" ] }
  }
...
}

因此,如果看起来 JEST 没有转换您的测试文件(SyntaxError: Cannot use import statement outside a module在运行与您的文件test.jsspec.js文件相关的测试时,哪个标志可以是一个),我建议您检查是否已NODE_ENV定义。使用env命令(在 MacOS 和 Linux 上或适用于您的环境的命令)检查配置的环境变量。如果您已经将它配置为某些内容(除了test),您需要删除它或在您的 jest 命令前加上适当的覆盖:env NODE_ENV=test jest

我希望它会帮助别人。我花了好几个小时才弄清楚发生了什么......