Jest-тестирование setTimeout ведет себя не так, как ожидалось - PullRequest
0 голосов
/ 19 ноября 2018

При тестировании функции ниже я не могу заставить setTimeout работать должным образом. Я пытался использовать useakeTimers, runAllTimers, advanceTimersByTime, как предложено в документации, но таймер, похоже, вообще не активируется.

const clearTasks = () => {
  const clearTasksBtn = document.querySelector('.clear-tasks-btn');
  const tasksSection = document.querySelector('.tasks-section');
  const body = document.body;
  clearTasksBtn.addEventListener('click', e => {
    if (tasksSection.childElementCount) {
      Array.from(tasksSection.children).forEach(child => child.remove());
      localStorage.clear();
    } else {
      if (body.firstChild.className === 'alert') {
      } else {
        const alert = document.createElement('p');
        alert.className = 'alert';
        alert.textContent = "There aren't any tasks";
        body.insertBefore(alert, body.childNodes[0]);
        setTimeout(() => {
          alert.remove();
        }, 2000);
      }
    }
  });
};
Мой тест

import clearTasks from './clearTasks';
describe('clearTasks', () => {
  document.body.innerHTML = `
    <button  class="clear-tasks-btn">Clear Tasks</button>
    <section class="tasks-section"></section>
    `;
  const body = document.body;
  const clearTasksBtn = document.querySelector('.clear-tasks-btn');
    beforeEach(() => {
        clearTasks();
        clearTasksBtn.click();
        jest.useFakeTimers()
        jest.runAllTimers()
        jest.advanceTimersByTime(2000)
    });
  it("should display alert if section with class tasks-section dosn't have any children", () => {
    
    expect(body.firstChild.className).toMatch('alert');
  });
  it('should remove the alert after 2000 milliseconds', () => {
    expect(body.firstChild.className).not.toMatch('alert');
  },2000);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...