You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:27:05