导入图像会打破开玩笑测试

时间:2017-10-23 21:12:43

标签: reactjs testing webpack jestjs

在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
}

我错过了什么?

6 个答案:

答案 0 :(得分:7)

我将尽可能简化

导入图像文件时,Jest尝试将图像的二进制代码解释为.js,因此会出错。

the only way out is to mock a default response anytime jest sees an image import

我们该怎么做?

  • 首先,您告诉Jest每次遇到图像导入时都要运行模拟文件。您可以通过将以下密钥添加到package.json文件中来实现此目的
"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)

我遇到了同样的问题,我是这样解决的:

  1. npm install -D jest-transform-stub
  2. 然后,在 package.json 中,我添加了以下转换:

    "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