@huse/effect-ref
Version:
--- title: README nav: title: Hooks path: /hook group: title: Effect Ref path: /effect-ref order: 1 ---
47 lines (40 loc) • 1.35 kB
JavaScript
/* eslint-disable no-console, react/jsx-no-bind */
import {render} from '@testing-library/react';
import {useEffectRef} from '../index';
const Foo = ({onRef}) => {
const ref = useEffectRef(onRef);
return <div ref={ref} />;
};
test('call on mount', () => {
const callback = jest.fn();
render(<Foo onRef={callback} />);
expect(callback).toHaveBeenCalled();
expect(callback.mock.calls[0][0] instanceof HTMLElement).toBe(true);
});
test('dispose on unmount', () => {
const dispose = jest.fn();
const callback = () => dispose;
const {unmount} = render(<Foo onRef={callback} />);
unmount();
expect(dispose).toHaveBeenCalled();
});
test('dispose calls only once', () => {
const dispose = jest.fn();
const callback1 = () => dispose;
const callback2 = () => undefined;
const callback3 = () => undefined;
const {unmount, rerender} = render(<Foo onRef={callback1} />);
rerender(<Foo onRef={callback2} />);
rerender(<Foo onRef={callback3} />);
unmount();
expect(dispose).toHaveBeenCalledTimes(1);
});
test('warn on invalid return', () => {
const callback = jest.fn(() => 123);
const warn = jest.fn();
const nativeWarn = console.warn;
console.warn = warn;
render(<Foo onRef={callback} />);
console.warn = nativeWarn;
expect(warn).toHaveBeenCalled();
});