Имитация функции утилиты debounce с использованием библиотеки тестирования реакции или шутки без использования lodash - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь издеваться над своей служебной функцией debounce, но не хватает моего освещения. Все проходит, но ни одна из моих линий не покрыта. Я не использую _loda sh.

Test. js

import { debounce } from '../../data/utils/utils';

afterEach(cleanup);

jest.useFakeTimers();

describe('debounce util', () => {
  const callback = jest.fn();

  beforeEach(() => {
    debounce(callback, 500);
  });

  it('should call debounce util', () => {
    for (let i = 0; i < 100; i++) {
      debounce(callback, 10);
    }
    jest.runAllTimers();
    expect(callback).toBeCalledTimes(0);
  });
});

Util. js

export const debounce = function debounce(fn, ms) {
  let timer;
  return () => {
    clearTimeout(timer);
    timer = setTimeout(() => {
      timer = null;
      fn.apply(this, arguments);
    }, ms);
  };
};

1 Ответ

1 голос
/ 06 августа 2020

Мне кажется, что вы неправильно тестируете функциональность противодействия. Вызов debounce возвращает новую функцию. Вам нужно выполнить функцию возврата. Также вы должны проверить, что обратный вызов не вызывается до истечения тайм-аута и что он вызывается ровно один раз после истечения тайм-аута.

Вот модифицированная версия вашего теста:

import { debounce } from '../../data/utils/utils';

afterEach(cleanup);

jest.useFakeTimers();

describe('debounce util', () => {
  const callback = jest.fn();

  beforeEach(() => {
    // Reset in case there are more test cases depending on the same mock
    callback.mockReset();
  });

  it('should call debounce util', () => {
    const debouncedCallback = debounce(callback, 10);
    for (let i = 0; i < 100; i++) {
      // Execute the debounced function
      debouncedCallback();
    }

    // Should not have been called yet since 10ms is not passed
    expect(callback).not.toHaveBeenCalled();

    // Fast forward time => 10ms will be passed
    jest.runAllTimers();

    // Now the callback should have been called exactly once
    expect(callback).toBeCalledTimes(1);
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...