logo@krutoo/utils

ResizeObserverMock

Mock-implementation of ResizeObserver with ability of simulating resize programmatically.

Basic usage

import { ResizeObserverMock } from '@krutoo/utils/testing';

// creating like normal ResizeObserver
const observer = new ResizeObserverMock(callback);

// using like normal ResizeObserver
observer.observe(element);
observer.unobserve(element);
observer.disconnect(element);

// somewhere in your tests
observer.simulateResize([
  // all entry properties except `target` is optional
  // properties that is not provided will be filled by mocks
  {
    target: document.querySelector('#my-widget'),
  },
]);

Typical unit-test

Here is an example of unit test with ResizeObserverMock. For implementation useResize is used:

import { ResizeObserverContext, useResize } from '@krutoo/utils/react';
import { ResizeObserverMock } from '@krutoo/utils/testing';
import { act, render } from '@testing-library/react';
import { describe, expect, mock, test } from '#test-utils';

function MyComponent({ onResize }) {
  const ref = useRef(null);

  useResize(ref, () => {
    onResize?.();
  });

  return (
    <div ref={ref} data-testid='my-component'>
      Hello from my component
    </div>
  );
}

describe('MyComponent', () => {
  test('should call onResize on resize', () => {
    const observer = new ResizeObserverMock(() => {});

    const context = {
      getObserver(callback: ResizeObserverCallback) {
        return observer.addCallback(callback);
      },
    };

    const spy = mock.fn();

    const { getByTestId } = render(
      <ResizeObserverContext value={context}>
        <MyComponent onResize={spy} />
      </ResizeObserverContext>,
    );

    // no calls after render
    expect(spy.mock.callCount()).toBe(0);

    // one call after resize simulated
    act(() => {
      observer.simulateResize([
        {
          target: getByTestId('my-component'),
        },
      ]);
    });
    expect(spy.mock.callCount()).toBe(1);
  });
});

As you can see, mock includes chainable addCallback method. You can use it to provide one observer for multiple components during test.