在使用 Jest 进行测试时如何忽略“-!svg-react-loader!./path/to/my.svg”而不将所有内容与 webpack 捆绑在一起

How can I ignore "-!svg-react-loader!./path/to/my.svg" when testing with Jest without bundling everything with webpack

我们正在为应用程序中的一些 SVG 文件使用 svg-react-loader。我们正在尝试使用 babel-jest 和以下 .babelrc:

将 jest 设置为 运行
{
  "presets": [
    "es2015", 
    "react"
  ],
  "plugins": [
    "transform-decorators-legacy", 
    "transform-class-properties",
    "transform-object-rest-spread"
  ]
}

以下测试失败:

/* global it, document */
import React from 'react'
import ReactDOM from 'react-dom'
import Comp from './Icon'

it('renders without crashing', () => {
  const div = document.createElement('div')
  ReactDOM.render(<Comp><div /></Comp>, div)
})

有错误: Cannot find module '-!svg-react-loader!../../assets/grid.svg' from 'Icon.js'

我怎么能忽略以 import grid from '-!svg-react-loader!../../assets/grid.svg' 开头的导入开玩笑?

我解决这个问题的方法是在模块的开头为任何包含 -!svg-react-loader! 的导入添加一个笑话模拟。

"moduleNameMapper": {
   "^-!svg-react-loader.*$": "<rootDir>/config/jest/svgImportMock.js"
}

其中svgImportMock.js是:

'use strict';
module.exports = 'div';

这并不理想,因为文件可能不存在,但假设我们在使用 webpack 捆绑时看到缺少的模块。

我通过安装 jest-svg-transformer 解决了这个问题,然后添加了这个配置:

{ "jest": { "transform": { "^.+\.svg$": "jest-svg-transformer" } } }

我能够通过在 Jest 中正确处理静态资产来解决这个问题 (https://jestjs.io/docs/en/webpack#handling-static-assets):

// package.json
{
  "jest": {
    "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)$": "<rootDir>/__mocks__/styleMock.js"
    }
  }
}

// __mocks__/styleMock.js

module.exports = {};
// __mocks__/fileMock.js

module.exports = 'test-file-stub';