Npm Jest和ES2015导入。使jest尊重package.json中的pkg.module声明
我正在通过我的应用程序中的npm导入。环境包括webpack、babel、typescript、react、redux、jest 我设法使Jest在ES2015导入中正常工作,但Jest拒绝使用es.js版本的deepmerge(请参阅以获取参考) 简单地说,deepmerge使用了一个名为的包,该包为CommonJS兼容环境和库(如RequireJS)编译ES2015发行版和其他发行版。然后在deepmerge的package.json中引用它们,如下所示:Npm Jest和ES2015导入。使jest尊重package.json中的pkg.module声明,npm,module,ecmascript-6,node-modules,jestjs,Npm,Module,Ecmascript 6,Node Modules,Jestjs,我正在通过我的应用程序中的npm导入。环境包括webpack、babel、typescript、react、redux、jest 我设法使Jest在ES2015导入中正常工作,但Jest拒绝使用es.js版本的deepmerge(请参阅以获取参考) 简单地说,deepmerge使用了一个名为的包,该包为CommonJS兼容环境和库(如RequireJS)编译ES2015发行版和其他发行版。然后在deepmerge的package.json中引用它们,如下所示: "main": "dist/u
"main": "dist/umd.js",
"module": "dist/es.js"
这样,当在应用程序中导入deepmerge时,编译器应该足够明智,根据其运行的环境使用正确的文件
这可能过于简单了,但你应该明白这一点
现在,我的应用程序正在解析一切,并且正在编译脚本的正确版本(es.js
)。相反,Jest导入了错误的文件(umd.js
),从而破坏了测试(TypeError:deepmerge_1.default不是函数
)
我已经找到了解决办法,比如在import语句中指定正确文件的路径,而不是依赖于从“deepmerge”导入deepmerge代码>。但是我觉得应该有一种更好的方法,以防包的维护人员决定更改路径、文件名或其他任何东西,这种方法更适合未来
有什么想法吗
jest.config.json
{
"transformIgnorePatterns": [
"<rootDir>/node_modules/(?!deepmerge)"
],
"transform": {
".(js|ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
},
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json"]
}
编辑:稍作调整,使其使用包的模块字段。由于jest.mock的原因,他无法生成一个helper函数,不得不将该名称重复三次
jest.mock('modulename', () => require('modulename/' + require('modulename/package.json').module));
原始答复: 我在导入我们自己的一个使用package.module的内部库时遇到了同样的问题。我的理解是,因为JEST是在节点中运行的(我们的测试不通过WebPack),所以会忽略package.module,而使用package.main 我能够在测试中使用模拟解决这个问题:
jest.mock('modulename', () => require('modulename/builds/es'));
对于每个使用pkg.module的模块来说,这样做很乏味,但比手动模拟其内容要好,而且我可以保持测试代码的导入完好无损
另一种方法是编写一个转换,将模块的es版本映射/代理到commonjs版本,但这并没有让我走得太远
我希望将来有更好的解决办法
jest.mock('modulename', () => require('modulename/builds/es'));