在React组件中导入资产 (例如,从“../../../assets/img/logo.png”导入徽标) 给出了这样的错误
({ “对象”。:功能(模块,出口,需要,__目录名,文件名__,全球,笑话){PNG
SyntaxError:无效或意外的令牌 在ScriptTransformer._transformAndBuildScript(node_modules / jest-runtime / build / script_transformer.js:305:17)
我的jest配置是
"jest": {
"testRegex": ".*\\.spec\\.js$",
"moduleFileExtensions": [
"js",
"jsx",
"json"
],
"moduleDirectories": [
"node_modules",
"src",
"assets"
],
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$/": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less|scss)$": "<rootDir>/__mocks__/styleMock.js"
},
"verbose": true,
"bail": true
}
我错过了什么?
答案 0 :(得分:7)
导入图像文件时,Jest尝试将图像的二进制代码解释为.js,因此会出错。
the only way out is to mock a default response anytime jest sees an image import
"jest": {
"moduleNameMapper": {
"\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less)$": "<rootDir>/mocks/fileMock.js"
}
}
如果您已经拥有
"Jest"
键,只需在其中添加"moduleNameMapper"
子项
fileMock.js
文件。用下面的代码片段填充文件module.exports = '';
Note > if you are using es6 u can use export default ''; to avoid an Eslint flag
完成上述步骤后,您可以重新开始测试, 您一切顺利。
注意。请记住在moduleNameMapper
中添加图像文件的各种扩展名,以便对其进行模拟。
我希望我能提供帮助。 #欢呼!
答案 1 :(得分:6)
适合任何正在研究此问题的人。您必须安装npm install --save-dev identity-obj-proxy
才能获得必要的依赖关系。
"jest": {
"moduleNameMapper": {
".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "identity-obj-proxy"
}
}
答案 2 :(得分:1)
如果你想在webpack中使用jest,你需要明确地配置它。请在此处查看本指南:http://facebook.github.io/jest/docs/en/webpack.html
答案 3 :(得分:1)
我遇到了同样的问题,我是这样解决的:
npm install -D jest-transform-stub
"jest": {
...
"transform": {
...
".+\\.(css|scss|png|jpg|svg)$": "jest-transform-stub"
答案 4 :(得分:0)
如果IOS映像名称带有@
moduleNameMapper: {
"^image![a-zA-Z0-9$_-]+$": "GlobalImageStub",
"^[@./a-zA-Z0-9$_-]+\\.(png|gif)$": "RelativeImageStub"
}
答案 5 :(得分:0)
我遇到了同样的问题!我不确定它是否与原始问题中的情况相同,但对我来说,开玩笑仍然以某种方式尝试将图像加载为 JS 并尝试解析它们,同时我将匹配图像扩展名的文件映射到 {{ 1}}。我的文件还包含一些将 moduleNameMapper
字符映射到根 src 目录的代码,因为我有 webpack 并且它在项目(和 TS)中被配置为 webpack 别名。 @
中的完整 moduleNameMapper
条目对我来说是这样的:
jest.config.js
对我来说,当我在组件中导入图像时,路径类似于:'@/assets/someImage.jpg'。但是,这似乎会首先匹配第一个正则表达式,即覆盖 moduleNameMapper: {
'^@$': '<rootDir>/src',
'^@/(.*)':
'<rootDir>/src/$1',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'<rootDir>/__mocks__/fileMock.js',
// '\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js',
'.*\\.(css|less)$': 'identity-obj-proxy',
}
别名的那个:@
。因此,它被映射到 ^@/(.*)
而不是 <rootDir>/src/$1
。
我通过使别名只匹配非图像来修复它:
<rootDir>/__mocks__/fileMock.js