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
相关产品推荐
相关产品推荐

