React 配置单元测试时使用 Enzyme 出现 Cannot find module 'react-dom/test-utils' 报错信息
过程
最近在给一个 React 项目添加单元测试,使用的是 Jest + Enzyme 按照 官方文档,Enzyme + React 的使用如下, 我安装的适配器是 v16 的版本:
npm i --save-dev enzyme enzyme-adapter-react-16
代码中使用
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
在使用中报 Cannot find module 'react-dom/test-utils'
这个错误信息
问题排查
在 Google 上搜了一圈没发现相关解决方案,只看到有人也报这个错误是因为用的 React 版本是 v0.14,升级到 v15 以上就能解决
我看了一下我的项目 package.json 文件,发现 React 版本的描述是 "react": "npm:@preact/compat@^17.0.6"
看似好像是说 React 是 v17 的版本,'react-dom/test-utils'
这个工具包在 v17 上应该是有的,问题就在于 preact/compat
这个东西
又在网上搜了一圈,原来此 react 非彼 React
2017年的时候,React 爆出开源协议有问题,百度直接禁止使用 React 与 React Native 框架,而 preact
就是当时用来代替 React 框架的解决方案之一
所以问题在于 preact 与原生 React 的实现方式不一致,代码结构也不可能一致,从 React 迁移到 preact 过程中,与一些第三方框架的结合上会出问题,其中就包括 Enzyme
解决方案
preact
的官方文档给出了解决方案
我的代码之前使用的是 React 的适配器 enzyme-adapter-react-16
,先将它移除:
npm uninstall enzyme-adapter-react-16
然后后安装 preact 的适配器 enzyme-adapter-preact-pure
npm install --save-dev enzyme-adapter-preact-pure
代码导入部分也替换为 preact 的适配器 enzyme-adapter-preact-pure
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-preact-pure';
Enzyme.configure({ adapter: new Adapter() });
这样问题就解决了,所以最终这其实是一个 preact 库如何使用 Enzyme 框架的问题