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

Recharts Jest快照测试:ResizeObserver与MUI Tabs兼容问题求助

解决方案

针对同时使用Recharts(带ResponsiveContainer)和MUI Tabs的Jest快照测试冲突问题,以下是几种优雅的解决思路:

方案一:自定义兼容型ResizeObserver模拟(推荐)

在Jest全局配置文件(如jest.setup.js)中添加一个极简的ResizeObserver模拟实现,仅满足Recharts的核心需求,避免第三方polyfill与MUI的逻辑冲突:

// jest.setup.js
global.ResizeObserver = class ResizeObserver {
  constructor(callback) {
    this.callback = callback;
  }

  observe(target) {
    // 模拟初始化时的resize回调,提供默认尺寸
    this.callback([{
      target,
      contentRect: {
        width: target.clientWidth || 800,
        height: target.clientHeight || 600,
      },
    }]);
  }

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

这个模拟只实现了Recharts ResponsiveContainer需要的observe方法,不会引入第三方polyfill的额外特性,完美适配MUI Tabs的内部逻辑。

方案二:按需启用polyfill,隔离影响范围

如果全局模拟仍有问题,可以在单个测试文件中临时启用polyfill,测试完成后恢复原有环境:

import { render } from '@testing-library/react';
import MyComponent from './MyComponent';

describe('MyComponent', () => {
  let originalResizeObserver;

  beforeEach(() => {
    // 保存当前ResizeObserver实例
    originalResizeObserver = global.ResizeObserver;
    // 临时引入polyfill
    global.ResizeObserver = require('resize-observer-polyfill');
  });

  afterEach(() => {
    // 恢复原有环境
    global.ResizeObserver = originalResizeObserver;
  });

  it('生成正确的快照', () => {
    const { asFragment } = render(<MyComponent />);
    expect(asFragment()).toMatchSnapshot();
  });
});

这种方式将polyfill的影响限制在特定测试块内,避免污染其他测试用例。

方案三:绕过ResizeObserver,给ResponsiveContainer指定固定尺寸

在测试环境中替换Recharts的ResponsiveContainer,直接使用固定宽高,从根源上避免对ResizeObserver的依赖:

// 在测试文件顶部添加mock
import { ResponsiveContainer } from 'recharts';

// 自定义测试用的ResponsiveContainer
const TestResponsiveContainer = ({ children }) => (
  <ResponsiveContainer width={800} height={600}>
    {children}
  </ResponsiveContainer>
);

// 替换原组件
jest.mock('recharts', () => ({
  ...jest.requireActual('recharts'),
  ResponsiveContainer: TestResponsiveContainer,
}));

// 正常执行测试
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';

it('生成正确的快照', () => {
  const { asFragment } = render(<MyComponent />);
  expect(asFragment()).toMatchSnapshot();
});

此方案适合不需要测试响应式逻辑的快照场景,完全规避了ResizeObserver相关问题。

内容的提问来源于stack exchange,提问作者Darren Landig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:35:21