У меня есть этот простой компонент fallbackImage:
export interface ImageProps {
srcImage: string;
classNames?: string;
fallbackImage?: FallbackImages;
}
const Image = ({
srcImage,
classNames,
fallbackImage = FallbackImages.FALLBACK
}: ImageProps) => {
const imgToSourceFrom = srcImage;
const imgToFallbackTo = fallbackImage;
const imageRef = useRef(null);
const whenImageIsMissing = () => {
imageRef.current.src = imgToFallbackTo;
imageRef.current.onerror = () => {};
};
return (
<img ref={imageRef} src={imgToSourceFrom} className={classNames} onError={whenImageIsMissing} />
);
};
export default Image;
Работает отлично. У меня есть тестовый запуск с Jest
и React-Testing-Library
. Я протестировал все, кроме одного сценария. Вот этот:
const whenImageIsMissing = () => {
imageRef.current.src = imgToFallbackTo;
imageRef.current.onerror = () => {}; // This line.
};
Эта строка в основном предотвращает бесконечный цикл в случае отсутствия обоих изображений
Проблема: я хочу проверить, что моя onerror
функция вызывалась ровно один раз. Что я действительно застрял в том, как это сделать. Вот тест ...
const { container } = render(<Image srcImage={undefined} fallbackImage={undefined} />);
const assertion = container.querySelector('img').onerror;
fireEvent.error(container.firstElementChild);
console.log(container.firstElementChild);
expect(container.firstElementChild.ref.current.onerror).toHaveBeenCalledTimes(1);
// This though has no reference to a real value. Is an example of what I want to get at.
Вопрос: Как получить доступ к функции обратного вызова ref и проверить, сколько раз вызывалась моя функция?
Любые идеи по этому поводу. Я в растерянности, пробовал издеваться над refs
, пробовал издеваться и шпионить за компонентом. Я пробовал использовать act и async / await, если он был вызван после. Мне действительно нужна помощь в этом ..