Jest+Enzyme测试Styled Component时报React.createElement类型无效警告
问题产生原因
- 导入路径不匹配:Abc.jsx 中导入样式的语句为
import * as Styled from './Abc.css',但实际样式文件的完整名称是Abc.css.jsx,二者路径后缀不一致。 - Jest 配置触发样式代理:Jest 配置中设置了所有以
.css、.less等样式后缀结尾的文件,统一使用identity-obj-proxy代理。当你按./Abc.css路径导入时,Jest 会判定这是普通 CSS 文件,直接返回代理空对象,不会去查找真实的Abc.css.jsx文件,导致调用的Styled.Title为undefined,触发 React 创建元素时的类型无效报错。 - 语法细节问题:Abc.jsx 中样式组件的关闭标签多了空格,
</ Styled.Title>的写法不符合语法规范,也可能导致解析异常。
修复方案
- 修正 Abc.jsx 中的样式导入路径,两种方案二选一即可:
- 方案A:直接写全样式文件的完整后缀,将导入语句改为
import * as Styled from './Abc.css.jsx' - 方案B:如果不想每次写全
.css.jsx后缀,可在构建工具(Webpack/Vite等)的resolve.extensions配置中添加.css.jsx后缀,同时将 Jest 配置中 JS/JSX 转译的匹配规则调整为可识别该后缀,再将导入语句改为import * as Styled from './Abc'(省略所有后缀,自动匹配同名的.css.jsx文件)
- 方案A:直接写全样式文件的完整后缀,将导入语句改为
- 修正关闭标签的语法错误:将
<Styled.Title>ABC</ Styled.Title>改为<Styled.Title>ABC</Styled.Title> - 确认 Jest 配置的样式匹配规则正确,默认的
"\\.(css|less|scss|sass)$": "identity-obj-proxy"已经是匹配纯样式后缀结尾的文件,只要导入路径不以纯样式后缀结尾,就不会被拦截,会走正常的 JSX 转译逻辑。
内容的提问来源于stack exchange,提问作者janitheshan
相关产品推荐
相关产品推荐

