我试着测试使用ResizeObserver的钩子。另外,我需要检查元素是溢出的还是在调整大小之后没有溢出的。所以我写了一个这样的决定:
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回调。测试:
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();
});
});发布于 2021-04-27 10:04:43
应该定义调整大小的观察者构造函数,并添加一个侦听器来测试调整大小的观察者回调。
let listener: ((rect: any) => void) | undefined = undefined;
(global as any).ResizeObserver = class ResizeObserver {
constructor(ls) {
listener = ls;
}
observe() {}
unobserve() {}
disconnect() {}
};然后应该指定所需的属性:
act(() => {
listener!([
{
target: {
clientWidth: 100,
scrollWidth: 200,
clientHeight: 100,
scrollHeight: 200,
},
},
]);
});受https://github.com/streamich/react-use/blob/master/tests/useMeasure.test.ts启发
https://stackoverflow.com/questions/66657968
复制相似问题