问题
使用 jest 进行单元测试时,对引用了 antd 的组件进行单元测试时可以成功通过测试。但是当使用 --coverage 参数生成测试覆盖率报告时,出现了报错。
测试的 UI 组件如下:
1 | import React from 'react'; |
报错信息如下:
1 | FAIL src/routes/User/__test__/User.test.js |
解决
方法 1
不使用 ES6 解构赋值方法引用 Card 内置组件
1 | // const { Meta } = Card; |
方法 2
直接使用 Card 内置组件
1 | render() { |
方法3
本问题出现的原因关键在于使用了 babel-plugin-import 插件,我们可以通过 babel 的 env 配置项来决定何时启用 babel-plugin-import 插件。需要知道的是进行 jest 测试时默认会将 NODE_ENV 设置为 test,babel 中 env 选项的值将从 process.env.BABEL_ENV 获取,如果没有的话,则获取 process.env.NODE_ENV 的值,它也无法获取时会设置为 development。在平时开发以及打包时 NODE_ENV 一般约定值为 development 或 production,我们可以在这两个环境时才启用 babel-plugin-import 插件。不过由于取消了按需加载 antd 样式,在测试时可能有性能的影响。
另外在 jest 测试时需要将 babel-preset-env 中的 modules 选项打开 (babel 7 同)。
这里使用 js 文件来复用相同的配置。babel 配置如下:
1 | // .babelrc.js |
参考资料: