babel-jest不会在模块中处理ES6

jam*_*ust 26 jestjs babeljs es6-modules

我正在尝试在一个使用ES6模块的基于React的项目上设置Jest.但是我似乎遇到了ES6模块的问题,我正在使用babel-jest并相信我已正确设置(Jest会自动检测到它).

Jest似乎没有使用ES6导入的问题,但是只要它在其中一个导入模块中的导入语句上命中它就会窒息.就好像它只是转发初始测试脚本而不是任何导入的模块.我尝试了各种配置,并尝试搜索谷歌没有运气.没有任何导入的运行测试工作正常.

这是错误:

({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Predications from './predications';
                                                                                         ^^^^^^
SyntaxError: Unexpected token import
Run Code Online (Sandbox Code Playgroud)

以下是配置的相关部分:

jest.conf.json

{
  "testRegex": "\/test\/spec\/.*\\.js$",
}
Run Code Online (Sandbox Code Playgroud)

.babelrc

{
  "presets": ["es2015", "stage-0", "react"]
}
Run Code Online (Sandbox Code Playgroud)

测试脚本

import React from 'react';
import { mount, shallow } from 'enzyme';
import Slider from 'react-slick';
import Carousel from '../../client/components/carousel/carousel.js'; // test chokes on when I include this module

describe('carousel component', () => {
  it('is a test test case', () => {
    expect(1 + 2).toEqual(3);
  });
});
Run Code Online (Sandbox Code Playgroud)

更新:

正如所建议的,我已经尝试在没有jest.conf.js的情况下运行测试,但是为了让Jest找到我的测试需要testRegex,我尝试将测试移动到默认测试目录,但它们仍然失败.

我想澄清测试本身运行正常,问题似乎是我导入的模块之一使用ES6,在上面的例子中,如果我不导入我的轮播组件,测试运行正常,我导入测试在该文件中的import语句上阻塞.似乎导入的模块没有被转换.

更新#2

经过一些调查后,问题似乎是babel没有在node_modules中转换ES6.我在这里创建了一个示例repo来演示这个:https://github.com/jamiedust/babel-jest-example

我知道第三方模块应该处理他们自己的转换,但是我们有许多模块,这些模块托管在我们自己的npm注册表上并在项目之间重用,在这些情况下Webpack处理转换,对于Jest测试我们需要这些由Babel编译的node_modules,或者利用我们的webpack设置为我们做这件事的方法.

在package.json(或Jest配置文件)中添加以下配置.

"jest": {
  "transformIgnorePatterns": [
    "/node_modules/(?!test-component).+\\.js$"
  ]
}
Run Code Online (Sandbox Code Playgroud)

小智 11

默认情况下,任何代码都node_modules被忽略babel-jest,请参阅Jest配置选项transformIgnorePatterns.我还在你的示例回购中创建了一个PR,所以你可以看到它正常工作.

虽然这有效,但我发现它在包含ES模块的许多依赖项的实际应用程序中非常慢.Jest代码库有一个稍微不同的方法,因为你可以在"babel-jest转换依赖关系"中找到 (抱歉,不会让我发布超过2个URL).这在Windows上也可能需要更长的时间,请参阅"在空回购上花费10秒钟".

如果进行"单元"测试,模拟可能是更好的方法.