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

如何mock getBoundingClientRect?调用时出现空值错误排查

问题分析与解决方案

你遇到的TypeError: Cannot read property 'getBoundingClientRect' of null错误,根源有两个核心问题:

1. Mock的Host元素缺少目标子元素

你创建了一个空的<div>作为mockConfig.host,但原逻辑里需要通过querySelector('.icon-dropdown')找到该div下的子元素。因为这个空div里没有.icon-dropdown元素,所以querySelector返回null,后续调用getBoundingClientRect()自然就触发了报错。

2. SpyOn的语法完全错误

你写的spyOn('mockConfig.host.querySelector',['getBoundingClientRect'])不符合Jasmine(推测你使用的是Jasmine测试框架)的Spy语法规则:

  • spyOn的第一个参数必须是要监听的对象,而不是字符串;
  • 第二个参数是字符串类型的方法名,不是数组。

修正后的测试代码方案

方案一:模拟真实DOM结构并Spy目标方法

这种方式更贴近真实DOM环境,适合需要验证DOM结构的场景:

describe('xxx',()=>{
  ...
  // 1. 创建完整的DOM结构:包含.icon-dropdown的div
  mockConfig.host = document.createElement('div');
  const iconDropdownEl = document.createElement('i');
  iconDropdownEl.className = 'icon-dropdown';
  mockConfig.host.appendChild(iconDropdownEl);

  // 2. 正确Spy目标元素的getBoundingClientRect方法
  spyOn(iconDropdownEl, 'getBoundingClientRect').and.returnValue(new DOMRect(0,0,0,0));
});

方案二:直接Mock方法返回值(更轻量化)

如果不需要验证DOM结构,只需要模拟方法返回,也可以直接mockquerySelector和getBoundingClientRect的行为:

describe('xxx',()=>{
  ...
  // 1. Mock.icon-dropdown元素的getBoundingClientRect方法
  const mockIconElement = {
    getBoundingClientRect: jasmine.createSpy().and.returnValue(new DOMRect(0,0,0,0))
  };

  // 2. Mock host的querySelector方法,让它返回上面的mock元素
  mockConfig.host = {
    querySelector: jasmine.createSpy().and.returnValue(mockIconElement)
  } as unknown as HTMLElement;
});

两种方案都能解决你的错误,你可以根据测试场景选择合适的方式。

内容的提问来源于stack exchange,提问作者Ranjith Varatharajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:15:55