让Jest理解ES6模块的导入/导出语法正处于沸点,这阻碍了我的项目开发进度。我的项目结构如下:
root module
org-domain (ES6)
org-services (ES6)
react-ui-module (React via CRA2)
org-services
在其程序包json中对org-domain
具有本地路径依赖性:
// in org-services package.json
"dependencies": {
"@org/domain": "file:../org-domain",
},
我在.babelrc
中的org-services
是:
{
"env": {
"test": {
"presets": ["@babel/preset-flow", "@babel/preset-env"]
"plugins": ["@babel/plugin-transform-modules-commonjs"]
}
},
"presets": [
"@babel/preset-flow",
["@babel/preset-env", {
"targets": {
"esmodules": true
}
}]
],
"plugins": [
["module-resolver", {
"root": ["./node_modules/@org/domain"],
"alias": {
"@org/constants": "./node_modules/@org/domain/src/constants",
"@org/contracts": "./node_modules/@org/domain/src/request-contracts"
}
}]
]
}
我不知道问题是否是由于我如何包含我的依赖项,因此为了清楚起见,我将添加与这些模块的导入/导出相关的所有细节。
在org-services
的实现文件中,我正在使用npm范围内的语法导入org-domain
,如下所示:import ... from '@org/domain
以下是我的一些观察结果:
在本地开发中,当我尝试引用@org/domain
时,我没有被定向到org-services/node_modules/@org/domain
,而是被重定向到了实际的相对目录位置,即root/org-services
。我相信Jest会忽略node_modules
(如果我错了,请纠正我),但是在jest.config.js
的{{1}}中,我有:
org-services
据我所知,现在一切都应该与我在测试中设置插件collectCoverage: true,
coverageDirectory: 'coverage',
coveragePathIgnorePatterns: [
'/node_modules/'
],
moduleDirectories: [
'src',
'node_modules'
],
moduleFileExtensions: [
'js'
],
transform: {
'^.+\\.js$': 'babel-jest'
},
transformIgnorePatterns: [
'node_modules/(?!@org/domain)$'
]
(在@babel/plugin-transform-modules-commonjs
内)中包含的.babelrc
指令有关的所有配置下正常工作位于'^.+\\.js$': 'babel-jest'
下的transform
中的jest.config.js
键,但不是。
关于此问题,我尝试了所有可以在网上找到的每件事,但没有成功。从那以后我一无所获,这个测试框架和对ES6的缺乏支持使我失去了耐心。应该不难,所以很明显我在这里做错了。请告知。
找到了另一个SO帖子,它反映了我所处的这种情况。 Jest fails to transpile import from npm linked module
很遗憾,所提供的解决方案不适用于我的情况。
答案 0 :(得分:0)
从@ babel / xyz升级:从7.0.0升级到7.1.2之后,我开始收到有关“导入”的错误
Jest encountered an unexpected token
<snip>
Details:
C:\....\SstcStrategy.test.js:2
import sequelizeFixtures from 'sequelize-fixtures';
^^^^^^
SyntaxError: Unexpected token import
at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)
要解决此问题,我必须添加@babel/plugin-transform-modules-commonjs
,就像您在问题中提到的那样。
我的babel.config.js
现在看起来像这样:
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
node: '8.10',
},
debug: false,
},
],
],
ignore: ['node_modules'],
plugins: [
'@babel/plugin-transform-runtime',
'@babel/plugin-transform-modules-commonjs',
// Stage 2
['@babel/plugin-proposal-decorators', { legacy: true }],
'@babel/plugin-proposal-function-sent',
'@babel/plugin-proposal-export-namespace-from',
'@babel/plugin-proposal-numeric-separator',
'@babel/plugin-proposal-throw-expressions',
// Stage 3
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
['@babel/plugin-proposal-class-properties', { loose: false }],
'@babel/plugin-proposal-json-strings',
],
};
顺便说一句,您无需在babel-jest
中定义jest.config.js
变换,因为这是默认设置。
希望这会有所帮助