【问题标题】:Babel will not compile .test.js files while running JestBabel 在运行 Jest 时不会编译 .test.js 文件
【发布时间】:2018-06-11 08:30:16
【问题描述】:

在运行 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"
  ]
}

【问题讨论】:

    标签: reactjs testing babeljs jestjs


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,确实为我节省了几个小时
    【解决方案2】:

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

    安装 babel-jest

    yarn add babel-jest --dev
    

    为测试环境配置 .babelrc

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

    {
      "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"
    },
    

    【讨论】:

    • 我以为你已经有了 babel-jest。你所做的是正确的。 jest 有不同的设置方式。现在要记住的重要一点是,如果您正在测试依赖于 NODE_ENV 的东西。你可能不会得到预期的结果,因为当你运行 jest 时它会改变前面提到的环境.. 干杯
    • 在哪里可以找到 .babelrc 文件?
    • 如果您使用 Webpack 等构建工具,.babelrc 应该位于项目的根目录中。如果你在命令行中使用 babel,这可以使用标志来完成,但我会推荐一个构建工具来让你的生活更轻松!
    • "Jest 会自动设置你的 Env 来测试" - 仅当它尚未设置时。这可能会让人头疼,所以使用env 命令来验证您是否已经将NODE_ENV 设置为其他值。在这种情况下,您需要删除它或在您的笑话命令前添加适当的覆盖:env NODE_ENV=test jest.
    • 我认为不需要“将 jest.config.json 添加到项目根目录”这一步。 Coz,根据 jest 文档,它是默认值。
    【解决方案3】:

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

    1).babelrc安装对应的模块并添加到package.json 定义不同的环境支持,因为您的玩笑总是将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_ENV 更改为 "test" 而 Babel 没有针对此环境的任何配置,我们通常为开发和生产环境定义 Babel 配置。当没有 babel 转译时,import 关键字实际上变成了undefined,因为它实际上不存在于 JS 上下文中。

    【讨论】:

    • 好的,babel 文件对我来说很有意义。我对 package.json 的修改有点困惑。我在 package.json 文件中究竟在哪里添加这些?另外,它们都只是开玩笑的配置设置吗?
    • 不,这只是一个 Jest 配置,您应该添加到 packages.json 或 jest 配置文件 @JordanHensley 中。 jest 的写法与devDependencies 相同
    • 我通过安装 babel-jest 找到了解决方案。感谢您指出正确的方向!
    • “jest 总是将 NODE_ENV 更改为 "test"” - 这不是真的,除非它尚未设置。这可能会让人头疼,所以使用env 命令来验证您是否已经将NODE_ENV 设置为其他值。在这种情况下,您需要删除它或在您的笑话命令前添加适当的覆盖:env NODE_ENV=test jest.
    猜你喜欢
    • 2020-01-07
    • 2019-08-25
    • 2019-03-25
    • 2020-05-13
    • 2017-09-24
    • 1970-01-01
    • 2019-08-15
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多