Как правило, легко протестировать простую функцию javascript, подобную приведенной ниже, которая не имеет доступа к DOM:

function sum(numberOne, numberTwo) {
  return numberOne + numberTwo;
}

Я собираюсь провести базовую демонстрацию тестирования другой функции, которая выполняет запись в DOM. Он будет по-прежнему основан на функции калькулятора, описанной выше, но на этот раз он возвращает ответ и вставляет в DOM. Посредством тестирования мы убедимся, что DOM получает ответ. Живая демонстрация проекта, над которым мы будем работать, а также репозиторий на github, приведены ниже:

Живая демонстрация https://bit.ly/39L0BOA

Репозиторий Github → https://github.com/shloch/DOM_testing_tutorial

Этот небольшой проект построен на ES6, управляется с помощью Webpack (читайте, как настроить здесь), тестирование проводится с помощью Jest.

В моей папке «src /» 3 файла:

function sum(numberOne, numberTwo) {  
  return numberOne + numberTwo;
} 
export default sum;
  • displayAnswer.js
    (собирает данные формы, вычисляет сумму и отображает ответ в DOM внутри тега HTML с id = уведомлением. Это что мы будем в основном тестировать)
import sum from './calculator'; 
const displayAnswer = () => { 
  const notification = document.querySelector("#notification");            
  const numberOne = +document.querySelector("#numberOne").value;  
  const numberTwo = +document.querySelector("#numberTwo").value;
const answer = sum(numberOne, numberTwo); 
  notification.innerHTML = `The sum is = ${answer}`;   

} 
export default displayAnswer;

просто содержит кнопку отправки (#addBtn) с прослушивателем событий, ожидающим нажатия перед началом добавления. Это также файл точки входа для веб-пакета;)

import displayAnswer from './displayAnswer';
const addBtn = document.querySelector("#addBtn");
addBtn.addEventListener("click", displayAnswer);

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

  • Calculator.test.js
import displayAnswer from '../src/displayAnswer';
import sum from '../src/calculator';
beforeEach(() => {
document.body.innerHTML = `
  <div id="calculator">
    <h3 id="notification"></h3>
    <input type="number" value="5" name="numberOne" id="numberOne" />
    +
    <input type="number" value="3" name="numberTwo" id="numberTwo" />
    <button id="addBtn">GET ANSWER</button>
  </div>`;
});
//-----test1---------------
test('Ensure SUM function works', () => {
 expect(sum(2, 3)).toBe(5);
  expect(sum(10, 1)).toBe(11);
  expect(sum(-2, 6)).toBe(4);
});
//------test2--------------
describe('Testing that Result displays in DOM', () => {
  test('Check answer Notification', () => {
    const notification = document.querySelector('#notification');
    displayAnswer();
    expect(notification.innerHTML).toEqual("The sum is = 8");
  });
});

Клон DOM копируется в тестовый файл

Обратите внимание, что beforeEach () тестового файла содержит копию структуры DOM. Помните, что наш тестовый файл запускается через консоль, поэтому у него не будет доступа к браузеру. Таким образом, мы воспроизведем структуру DOM нашего HTML-файла (Нажмите здесь, чтобы увидеть исходный HTML-файл) .

Также обратите внимание, что входные данные (функции beforeEach () ) предварительно загружены значениями (5 и 3). . Поэтому мы ожидаем, что в DOM отобразится текст:

«Сумма = 8»

Таким образом, перед запуском каждого из следующих тестов (test1 + test2) структура DOM будет воспроизведена.

test1 ← - это проверка простой функции javascript файла Calculator.js.

test2 ← - это проверка суммы, отображаемой в DOM (наша виртуальная DOM должна быть уточнена) после вызова функции displayAnswer () из файл displayAnswer.js.

Запуск теста:

Не забудьте посетить репозиторий Github, чтобы увидеть всю структуру папок проекта.

Вам необходимо клонировать проект локально, установить пакеты npm, запустить webpack и открыть файл в браузере. Вы также можете просто протестировать живую демонстрацию выше :)

Команда для запуска теста:

npm run test

Результат испытаний:

Надеюсь, это поможет более чем одному человеку;)