首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResizeObserver API测试玩笑

ResizeObserver API测试玩笑
EN

Stack Overflow用户
提问于 2021-03-16 15:08:42
回答 1查看 1.2K关注 0票数 4

我试着测试使用ResizeObserver的钩子。另外,我需要检查元素是溢出的还是在调整大小之后没有溢出的。所以我写了一个这样的决定:

代码语言:javascript
复制
import { useLayoutEffect, useState } from 'react';
import ResizeObserver from 'resize-observer-polyfill';

export default function useOverflowCheck(ref) {
  const [isOverflowing, setIsOverflowing] = useState(false);

  const isOverflow = current => {
    if (current) {
      const hasOverflowX = current.offsetWidth < current.scrollWidth;
      const hasOverflowY = current.offsetHeight < current.scrollHeight;

      setIsOverflowing(hasOverflowX || hasOverflowY);
    }
  };

  // eslint-disable-next-line react-hooks/exhaustive-deps
  useLayoutEffect(() => {
    const element = ref.current;

    const resizeObserver = new ResizeObserver(entries => {
      entries && entries.length && isOverflow(entries[0].target);
    });

    if (element) {
      resizeObserver.observe(element);
      return () => {
        resizeObserver.disconnect();
      };
    }
  });

  return isOverflowing;
}

我试着对这段代码进行单元测试,但是我的测试没有涵盖resizeObserver回调。测试:

代码语言:javascript
复制
import { renderHook } from '@testing-library/react-hooks';
import useOverflowCheck from './index';

describe('useOverflowCheck', () => {
  it('should return true for an overflowing component', () => {
    const el: HTMLDivElement = document.createElement('div');
    Object.defineProperties(el, {
      offsetWidth: { value: 30, configurable: true },
      offsetHeight: { value: 30, configurable: true },
    });

    const ref = {
      current: el,
    };

    expect(renderHook(() => useOverflowCheck(ref)).result.current).toBeTruthy();
  });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-27 10:04:43

应该定义调整大小的观察者构造函数,并添加一个侦听器来测试调整大小的观察者回调。

代码语言:javascript
复制
let listener: ((rect: any) => void) | undefined = undefined;
    (global as any).ResizeObserver = class ResizeObserver {
      constructor(ls) {
        listener = ls;
      }
      observe() {}
      unobserve() {}
      disconnect() {}
    };

然后应该指定所需的属性:

代码语言:javascript
复制
act(() => {
      listener!([
        {
          target: {
            clientWidth: 100,
            scrollWidth: 200,
            clientHeight: 100,
            scrollHeight: 200,
          },
        },
      ]);
    });

https://github.com/streamich/react-use/blob/master/tests/useMeasure.test.ts启发

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66657968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档