Как утверждать обратный вызов при использовании jest.useFakeTimers

Я пытаюсь понять, как правильно провести модульное тестирование пользовательского метода debounce, который у нас есть:

// function we want to test
function debounce(func, wait = 100) {
  let timeout;

  return (...args) => {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, wait);
  };
}

Вот неудачный юнит-тест Jest:

describe('DebounceExample', () => {
  beforeAll(jest.useFakeTimers);
  afterAll(jest.useRealTimers);

  it('should debounce', () => {
    // given
    const data = 'Chuck Norris is faster than you think';
    const debounceTime = 5000;
    const callback = jest.fn();
    const debouncedFunction = debounce(callback, debounceTime);

    // when
    debouncedFunction(data);

    // then
    expect(callback).not.toHaveBeenCalled();

    // when
    jest.runAllTimers(); // jest.advanceTimersByTime(debounceTime);

    // then
    expect(callback).toHaveBeenCalled();
  });
});

Отказ:

Error: expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0  Jest

Я также пробовал решение здесь: https://stackoverflow.com/a/52638566/704681 безуспешно

Обходной путь: единственный способ проверить это пока:

  it('should denounce - workaround', (done) => {
    // given
    const data = 'Chuck Norris is faster than you think';
    const debounceTime = 5000;
    const callback = jest.fn((param) => {
      // then
      expect(param).toEqual(data);
      done();
    });
    const debouncedFunction = debounce(callback, debounceTime);

    // when
    debouncedFunction(data);

    // then
    expect(callback).not.toHaveBeenCalled();

    // when (see 'then' inside callback implementation)
    jest.runAllTimers(); // jest.advanceTimersByTime(debounceTime);
  });

person A. Masson    schedule 04.11.2020    source источник
comment
Есть ли у вас воспроизводимое репо, поскольку похоже, что ваш код работает?   -  person tmhao2005    schedule 04.11.2020
comment
Пытался настроить codeandbox, но безуспешно: получил jest.advanceTimersByTime is not a function: codeandbox.io/s/jest-example-j72xu   -  person A. Masson    schedule 04.11.2020
comment
Не уверен, что вы настроили, но вы не можете запускать там свои команды.   -  person tmhao2005    schedule 04.11.2020
comment
Посмотрите на правую пустую панель, там 2 ВКЛАДКИ, одна - Тесты. Но не все Jest функции поддерживаются, например runAllTimers. Однако вы можете скачать пример и использовать npm run test   -  person A. Masson    schedule 04.11.2020
comment
Я пробовал ваш код, но работал хорошо, как ожидалось   -  person tmhao2005    schedule 05.11.2020
comment
Я знаю, что should denounce - workaround работает, теперь вопрос в том, почему я получаю Received number of calls: 0 на should debounce тесте ...   -  person A. Masson    schedule 06.11.2020
comment
Я имел в виду, что ваш оригинальный работает хорошо, а не обходной :)   -  person tmhao2005    schedule 06.11.2020
comment
Хм ... интересно. Тогда мне любопытно, что могло сделать это с моей стороны, Node версия? Использование v12.18.3   -  person A. Masson    schedule 06.11.2020
comment
Моя версия v14.13.1   -  person tmhao2005    schedule 06.11.2020