Я тестирую react
компонент, который использует setTimeout
. Проблема в том, что Jest
говорит, что setTimeout
вызывается, хотя это явно не так. Существует setTimeout
, чтобы удалить что-то из пользовательского интерфейса, и еще одно, чтобы приостановить таймер, когда мышь наводит курсор на компонент.
Я попытался добавить console.log()
, где setTimeout
и журнал консоли никогда не вызывается, что означает, что setTimeout в приложении не вызывается.
//app
const App = (props) => {
const [show, setShow] = useState(true);
const date = useRef(Date.now());
const remaining = useRef(props.duration);
let timeout;
useEffect(() => {
console.log('Should not run');
if (props.duration) {
timeout = setTimeout(() => {
setShow(false)
}, props.duration);
}
}, [props.duration]);
const pause = () => {
remaining.current -= Date.now() - date.current;
clearTimeout(timeout);
}
const play = () => {
date.current = Date.now();
clearTimeout(timeout);
console.log('should not run');
timeout = setTimeout(() => {
setIn(false);
}, remaining.current);
}
return (
<div onMouseOver={pause} onMouseLeave={play}>
{ show &&
props.content
}
</div>
)
}
//test
it('Should not setTimeout when duration is false', () => {
render(<Toast content="" duration={false} />);
//setTimeout is called once but does not come from App
expect(setTimeout).toHaveBeenCalledTimes(0);
});
it('Should pause the timer when pauseOnHover is true', () => {
const { container } = render(<Toast content="" pauseOnHover={true} />);
fireEvent.mouseOver(container.firstChild);
expect(clearTimeout).toHaveBeenCalledTimes(1);
fireEvent.mouseLeave(container.firstChild);
//setTimeout is called 3 times but does not come from App
expect(setTimeout).toHaveBeenCalledTimes(1);
});
Итак, в первом тесте setTimeout
не должен вызываться, но я получаю, что он вызывается один раз. Во втором тесте setTimeout
должен вызываться один раз, но вызывается 3 раза. Приложение работает нормально. Я просто не понимаю, что происходит с jest
, предполагая, что setTimeout
вызывается чаще, чем он. есть.