【发布时间】:2017-07-02 18:34:05
【问题描述】:
我正在尝试在使用 ES6 模块的基于 React 的项目上设置 Jest。但是我似乎遇到了 ES6 模块的问题,我正在使用 babel-jest 并且相信我已经正确设置了这个(Jest 会自动检测到它)。
Jest 使用 ES6 导入似乎没有问题,但是一旦它在一个导入的模块中遇到 import 语句,它就会窒息。就好像它只是在转换初始测试脚本而不是任何导入的模块。我尝试了各种配置并尝试搜索谷歌但没有运气。在没有任何导入的情况下运行测试工作正常。
这是错误:
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Predications from './predications';
^^^^^^
SyntaxError: Unexpected token import
以下是相关配置:
jest.conf.json
{
"testRegex": "\/test\/spec\/.*\\.js$",
}
.babelrc
{
"presets": ["es2015", "stage-0", "react"]
}
测试脚本
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);
});
});
更新:
按照建议,我尝试在没有 jest.conf.js 的情况下运行测试,但是需要 testRegex 才能让 Jest 找到我的测试,我尝试将测试移动到默认测试目录,但它们仍然失败。
我想澄清一下,测试本身运行良好,问题似乎是我导入的模块之一使用 ES6,在我上面的示例中,如果我不导入我的轮播组件,测试运行良好,尽快当我导入该文件中的导入语句时,测试会阻塞。似乎导入的模块没有被转译。
更新 #2
经过一番调查,问题似乎是 babel 没有在 node_modules 中转译 ES6。我在这里创建了一个示例 repo 来演示这一点:https://github.com/jamiedust/babel-jest-example
我知道第三方模块应该处理他们自己的转译,但是我们有许多模块托管在我们自己的 npm 注册表上并在项目之间重用,在这些情况下,Webpack 处理转译,用于 Jest 测试我们需要这些 node_modules 由 Babel 转译,或者利用我们的 webpack 设置为我们执行此操作。
解决方案
在 package.json(或 Jest 配置文件)中添加以下配置。
"jest": {
"transformIgnorePatterns": [
"/node_modules/(?!test-component).+\\.js$"
]
}
【问题讨论】:
-
当您从开玩笑设置中删除
transform部分时会发生什么。这在简单的情况下不需要。 -
@AndreasKöberle 我得到了同样的错误,是的,你的权利我似乎不需要它
-
你试过在没有
jest.conf.js的情况下运行吗?它应该可以在没有额外配置的情况下工作 -
我怀疑
textRegex和/或transform是问题的根源 -
你可以在这里验证github.com/MinimalNoise/persist-lead-service,测试完全通过
es-modules(虽然没有jsx)没有任何特定的jest配置
标签: babeljs jestjs es6-modules