Unit-тестирование модальных окон

Библиотека tingle.js представляет собой легковесное решение для создания модальных окон в веб-приложениях. Она позволяет быстро и без лишнего кода создавать красивые модальные окна с поддержкой анимаций и различных опций кастомизации. Важно, чтобы такие компоненты, как модальные окна, были протестированы на всех уровнях, включая unit-тестирование, что позволяет обеспечить их правильную работу в рамках приложения.

Основы тестирования модальных окон

Unit-тестирование модальных окон подразумевает тестирование их функциональности, независимости от других компонентов приложения. В случае с tingle.js, основными аспектами для тестирования являются:

  • Открытие и закрытие модального окна: проверка, корректно ли модальное окно открывается и закрывается.
  • Обработчики событий: проверка работы обработчиков событий, таких как клики на кнопки или закрытие окна по нажатию на фон.
  • Состояние модального окна: тестирование правильности отображения и скрытия модального окна в зависимости от состояния.

Для организации тестирования модальных окон с использованием tingle.js рекомендуется применять фреймворки, такие как Jest или Mocha, совместно с инструментами для работы с DOM, например, jsdom или Testing Library.

Создание тестового окружения

Перед началом написания тестов необходимо настроить тестовое окружение. Для этого потребуется установить несколько зависимостей.

  1. Установка библиотек для тестирования:

    npm install --save-dev jest @testing-library/jest-dom @testing-library/react jsdom
  2. Установка tingle.js:

    npm install tingle.js
  3. Настройка jest для работы с jsdom, чтобы эмулировать работу с DOM в среде тестирования.

Написание тестов для модальных окон

Тестирование открытия и закрытия окна

Модальные окна в tingle.js можно открыть и закрыть через вызовы методов .open() и .close(). Важно проверить, что окно корректно отображается при вызове метода open() и исчезает при вызове метода close().

Пример теста:

import Tingle from 'tingle.js';
import '@testing-library/jest-dom';
import { render } from '@testing-library/react';

describe('Modal window', () => {
  let modal;

  beforeEach(() => {
    modal = new Tingle();
    modal.setContent('<h1>Test Modal</h1>');
  });

  it('should open the modal', () => {
    modal.open();
    expect(modal.getElement()).toBeVisible();
  });

  it('should close the modal', () => {
    modal.open();
    modal.close();
    expect(modal.getElement()).not.toBeVisible();
  });
});

Тестирование кнопок и событий

Один из ключевых элементов модального окна — это кнопки для взаимодействия с пользователем. В tingle.js кнопки могут быть добавлены с помощью метода .addFooterBtn(). Тестирование взаимодействия с этими кнопками также является неотъемлемой частью unit-тестирования.

Пример теста для кнопки закрытия окна:

describe('Modal with close button', () => {
  let modal;
  const mockClose = jest.fn();

  beforeEach(() => {
    modal = new Tingle();
    modal.setContent('<h1>Modal with close button</h1>');
    modal.addFooterBtn('Close', 'tingle-btn tingle-btn--primary', mockClose);
  });

  it('should close the modal when close button is clicked', () => {
    modal.open();
    const closeButton = modal.getFooter().querySelector('button');
    closeButton.click();
    expect(mockClose).toHaveBeenCalled();
    expect(modal.getElement()).not.toBeVisible();
  });
});

Этот тест проверяет, что при клике на кнопку «Закрыть» вызывается функция mockClose, и модальное окно закрывается.

Тестирование фона модального окна

В tingle.js модальное окно можно закрывать не только с помощью кнопок, но и при клике на фон. Проверка этой функциональности важна для обеспечения удобства использования интерфейса.

Пример теста для клика по фону:

describe('Modal close on background click', () => {
  let modal;
  const mockClose = jest.fn();

  beforeEach(() => {
    modal = new Tingle();
    modal.setContent('<h1>Modal with background click</h1>');
    modal.setCloseContent('<span>×</span>');
    modal.addFooterBtn('Close', 'tingle-btn tingle-btn--primary', mockClose);
  });

  it('should close the modal when background is clicked', () => {
    modal.open();
    const modalBackdrop = modal.getElement().querySelector('.tingle-modal__backdrop');
    modalBackdrop.click();
    expect(mockClose).toHaveBeenCalled();
    expect(modal.getElement()).not.toBeVisible();
  });
});

Этот тест проверяет, что при клике на фон модального окна окно закрывается, а соответствующий обработчик вызывается.

Тестирование асинхронных операций

Модальные окна могут выполнять асинхронные операции, такие как загрузка данных или отправка формы. В таких случаях важно тестировать, что модальное окно правильно отображает состояние, например, индикатор загрузки, или корректно обновляет содержимое после выполнения операции.

Пример теста для асинхронной операции:

describe('Modal with async content loading', () => {
  let modal;

  beforeEach(() => {
    modal = new Tingle();
    modal.setContent('<h1>Loading...</h1>');
  });

  it('should load content asynchronously', async () => {
    modal.open();
    await new Promise((resolve) => setTimeout(resolve, 1000)); // имитация асинхронной загрузки
    modal.setContent('<h1>Data Loaded</h1>');
    expect(modal.getContent()).toContain('Data Loaded');
  });
});

Этот тест имитирует задержку при загрузке данных и проверяет, что после завершения операции модальное окно обновляет содержимое.

Использование моков и шпионов

Для тестирования функциональности, которая зависит от сторонних API или сервисов, полезно использовать моки и шпионов. Это позволяет изолировать тестируемый компонент от внешних зависимостей и сосредоточиться на логике модального окна.

Пример использования шпиона для отслеживания вызовов:

describe('Modal with external API interaction', () => {
  let modal;
  const mockApiCall = jest.fn(() => Promise.resolve({ data: 'Some data' }));

  beforeEach(() => {
    modal = new Tingle();
    modal.setContent('<h1>Fetching data...</h1>');
  });

  it('should call external API and display data', async () => {
    modal.open();
    await mockApiCall();
    modal.setContent('<h1>Data Loaded</h1>');
    expect(mockApiCall).toHaveBeenCalled();
    expect(modal.getContent()).toContain('Data Loaded');
  });
});

Заключение

Unit-тестирование модальных окон с использованием tingle.js позволяет убедиться, что все ключевые функции, такие как открытие и закрытие окна, работа с кнопками, а также обработка событий, функционируют корректно. Важно также тестировать взаимодействие с внешними сервисами, асинхронные операции и работу с фоном. Применение различных подходов, таких как моки и шпионы, делает тестирование более гибким и позволяет изолировать компоненты для более точных проверок.