Как я могу проверить функцию debounce с Jest / Enzyme? - PullRequest
0 голосов
/ 23 января 2019

У меня есть этот компонент, где тестовое покрытие говорит, что мне нужно проверить строки 24 и 25:

class TableToolbarComp extends Component {
  state = {
    shipmentId: '',
  };

  debouncedSetFilters = debounce(() => {
    const { applyFilters } = this.props; // LINE 24
    applyFilters(this.state);            // LINE 25
  }, 750);

  updateShipmentId = ev => {
    this.setState(
      {
        shipmentId: ev.target.value,
      },
      this.debouncedSetFilters,
    );
  };

  render() {...}
}

И тест:

  beforeEach(() => {
    applyFilters: k => k,
  });

...

  it('should trigger button click', () => {
    const wrapper = shallow(<TableToolbarComp {...props} />);

    wrapper.instance().debouncedSetFilters(750);
    wrapper.instance().updateShipmentId({ target: { shipmentId: '124' } });
    wrapper.instance().props.applyFilters({ shipmentId: '124' });
  });

И я не получаю никаких ошибок,он просто говорит, что эти две строки нуждаются в покрытии.

Я уже пытался вызвать debouncedSetFilters и applyFilters в тесте, но он все еще возвращает эти две строки как раскрытые.

Чего мне не хватает

1 Ответ

0 голосов
/ 23 января 2019

Функциональные вызовы невозможно эффективно протестировать без шпионов. Должно быть:

  beforeEach(() => {
    applyFilters = jest.fn();
  });

Для проверки асинхронной чувствительной ко времени функции следует применять таймеры:

jest.useFakeTimers();

const wrapper = shallow(<TableToolbarComp applyFilters={applyFilters} />);

wrapper.instance().debouncedSetFilters();
wrapper.instance().debouncedSetFilters();
expect(applyFilters).not.toHaveBeenCalled();
jest.advanceTimersByTime(750);
expect(applyFilters).toHaveBeenCalledTimes(1);

Тогда debouncedSetFilters может быть введено в тест updateShipmentId.

...