Шутливое тестирование обновления свойств внутри цепочки DOM

#javascript #unit-testing #dom #jestjs

#javascript #модульное тестирование #dom #jestjs

Вопрос:

Я пытаюсь определить способ проверить, было ли обновлено значение свойства из цепочки DOM.

В настоящее время у меня есть макет функции DOM, который возвращает объект, который я могу использовать для тестирования связанных функций. Однако как мне проверить textContent , обновлено ли значение свойства?

index.js

 const setText = (text) => {
  document.getElementById('id').textContent = text;
};
 

index.spec.js

 const mockListener = jest.fn();
jest.spyOn(document, 'getElementById').mockImplementation(() => ({
  addEventListener: mockListener,
  textContent: '',
}));

it('Should set text content', () => {
  setText('test');
  expect(document.getElementById).toHaveBeenCalledWith('id');
  // ? Trying to determine how to target to test the update
  expect(document.getElementById().textContent).toBe('test');
});
 

Ответ №1:

Поскольку mockImplementation оно будет вызвано во второй раз, вы будете получать отдельный объект каждый раз. Вы захотите извлечь возвращаемый объект в переменную и каждый раз возвращать один и тот же объект:

 it('Should set text content', () => {
  const mockDomObject = {
    addEventListener: jest.fn(),
    textContent: '',
  }
  jest.spyOn(document, 'getElementById').mockImplementation(() => mockDomObject);

  setText('test');

  expect(document.getElementById).toHaveBeenCalledWith('id');
  expect(mockDomObject.textContent).toBe('test');
});
 

В качестве альтернативы, если вы все еще хотите, чтобы настройка оставалась общедоступной, вы можете использовать document.getElementById.mock.results[0].value для доступа к тому же объекту DOM, который был возвращен для тестируемого модуля.

 setText('test');

expect(document.getElementById).toHaveBeenCalledWith('id');
const domObject = document.getElementById.mock.results[0].value;
expect(domObject.textContent).toBe('test');
 

Комментарии:

1. Это невероятно. Большое спасибо за объяснение и примеры!