Jest: setTimeout вызывается слишком много раз - PullRequest
0 голосов
/ 22 апреля 2019

Я тестирую 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 вызывается чаще, чем он. есть.

...