Jest测试React项目Leaflet MarkerCluster时报L.markerClusterGroup不是函数
问题根因
运行时正常但测试报错,核心原因是Jest运行环境和浏览器运行环境存在差异:
- leaflet.markercluster属于Leaflet插件,运行逻辑是加载时将
markerClusterGroup方法挂载到导入的Leaflet实例L上 - Jest默认会忽略转译node_modules下的依赖,且你之前Mock Leaflet时未手动补充插件挂载的方法,导致测试时
L上没有对应的markerClusterGroup方法,这也是你之前Mock方案不生效的核心原因。
解决方案
以下方案按优先级尝试即可:
方案1:手动补全Leaflet的Mock内容
该方案不需要修改全局配置,适配性最高,在用到markerCluster的测试文件顶部,或者全局Jest Mock文件中添加如下代码:
jest.mock('leaflet', () => { const originalLeaflet = jest.requireActual('leaflet'); // 手动挂载markerClusterGroup的Mock实现,按需补充业务中用到的所有方法 originalLeaflet.markerClusterGroup = jest.fn(() => ({ addLayer: jest.fn(), removeLayer: jest.fn(), clearLayers: jest.fn(), addTo: jest.fn(), // 其他用到的clusterGroup方法可在此补充对应的Mock实现 })); return originalLeaflet; });
如果TypeScript报类型错误,可在赋值时加as any临时绕开类型校验。
方案2:修改Jest转译规则,纳入leaflet相关依赖
修改jest.config.js(或package.json中的jest配置段),将leaflet和leaflet.markercluster从忽略转译的名单中剔除:
module.exports = { // 其余原有配置保持不变 transformIgnorePatterns: [ "/node_modules/(?!(leaflet|leaflet\\.markercluster)/)" ] };
该配置会让Jest转译这两个依赖的代码,确保插件能正常执行挂载逻辑。
方案3:全局挂载Leaflet实例后导入插件
在Jest全局setup文件(一般为jest.setup.ts)中添加如下代码:
import * as L from 'leaflet'; // 将L挂载到全局对象,确保插件加载时能获取到Leaflet实例 (global as any).L = L; // 主动导入markercluster插件,触发挂载逻辑 import 'leaflet.markercluster';
内容的提问来源于stack exchange,提问作者Vilagen
相关产品推荐
相关产品推荐

