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

使用Jest测试Shadcn Input-OTP组件时遇ResizeObserver未定义问题

解决Shadcn Input-OTP组件的Jest测试报错问题

问题背景

使用Shadcn Input-OTP组件构建OTP页面后,Jest测试出现连续错误:

  • 初始错误:ReferenceError: ResizeObserver is not defined
  • 模拟ResizeObserver后新错误:TypeError: _.observe is not a function

正确的ResizeObserver全局模拟方案

之前的模拟可能未完整实现ResizeObserver的必要方法,导致后续报错。在Jest的全局配置文件(比如jest.setup.js或src/setupTests.js)中添加完整模拟:

global.ResizeObserver = class ResizeObserver {
  constructor(callback) {
    this.callback = callback;
  }

  observe(target) {
    // 模拟触发回调,避免组件等待尺寸变化
    this.callback([{
      target,
      contentRect: {
        width: target.offsetWidth,
        height: target.offsetHeight,
        top: 0,
        left: 0,
        bottom: target.offsetHeight,
        right: target.offsetWidth,
        x: 0,
        y: 0
      }
    }]);
  }

  unobserve() {}
  disconnect() {}
};

针对_.observe错误的补充处理

如果上述模拟后仍出现该错误,大概率是组件内部依赖的Radix UI相关模块在测试环境中未被正确处理。可在测试文件顶部添加局部模拟:

jest.mock('@radix-ui/react-slot', () => ({
  __esModule: true,
  default: ({ children }) => children,
}));

单个测试文件的临时修复(可选)

若全局配置不便修改,也可在单个测试文件中直接定义全局ResizeObserver:

beforeAll(() => {
  global.ResizeObserver = class {
    constructor() {}
    observe() {}
    unobserve() {}
    disconnect() {}
  };
});

注:完整实现observe并触发回调能让组件渲染更贴近真实环境,避免因等待尺寸变化导致的渲染异常。

内容的提问来源于stack exchange,提问作者Reza Attar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:04:52