Для тестирования уведомлений на базе Noty важно корректно подключить библиотеку в тестовую среду. В проектах на Node.js обычно используется инструмент jsdom для имитации DOM в среде без браузера. Подключение Noty выглядит следующим образом:
const Noty = require('noty');
const { JSDOM } = require('jsdom');
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
global.document = dom.window.document;
global.window = dom.window;
Это позволяет создавать уведомления и проверять их поведение через DOM-элементы, не открывая браузер.
Самый базовый тест — удостовериться, что уведомление создается корректно и содержит ожидаемый текст:
test('создание уведомления с текстом', () => {
const notification = new Noty({
text: 'Тестовое уведомление',
type: 'success',
timeout: false
}).show();
const element = document.querySelector('.noty_bar');
expect(element).not.toBeNull();
expect(element.textContent).toBe('Тестовое уведомление');
});
Ключевой момент — использование селектора .noty_bar для
доступа к реальному DOM-элементу уведомления.
Noty поддерживает несколько типов уведомлений: alert,
success, warning, error,
information. Тестирование типа уведомления важно для
проверки визуального и логического поведения:
['alert', 'success', 'warning', 'error', 'information'].forEach(type => {
test(`уведомление типа ${type} создается корректно`, () => {
new Noty({ text: `Тип ${type}`, type, timeout: false }).show();
const element = document.querySelector('.noty_bar');
expect(element.classList.contains(`noty_type_${type}`)).toBe(true);
});
});
Такой подход позволяет убедиться, что для каждого типа уведомления применяется соответствующий CSS-класс.
Noty позволяет задавать timeout — время, через которое
уведомление автоматически исчезает. Для тестов с таймерами применяется
мок таймеров jest.useFakeTimers():
jest.useFakeTimers();
test('уведомление исчезает после timeout', () => {
new Noty({ text: 'Временное уведомление', timeout: 3000 }).show();
expect(document.querySelector('.noty_bar')).not.toBeNull();
jest.advanceTimersByTime(3000);
expect(document.querySelector('.noty_bar')).toBeNull();
});
Это позволяет проверять автоматическое скрытие уведомлений без реального ожидания.
Noty поддерживает callbacks: onShow,
onClose, onClick. Их тестирование позволяет
убедиться в корректном срабатывании логики приложения:
test('callback onShow вызывается при показе уведомления', () => {
const onShowM ock = jest.fn();
new Noty({ text: 'Тест', onShow: onShowMock, timeout: false }).show();
expect(onShowMock).toHaveBeenCalled();
});
test('callback onClose вызывается при закрытии уведомления', () => {
const onCloseM ock = jest.fn();
const n = new Noty({ text: 'Тест', onClose: onCloseMock, timeout: false }).show();
n.close();
expect(onCloseMock).toHaveBeenCalled();
});
Использование мок-функций позволяет проверять вызовы без побочных эффектов.
Для проверки реакции уведомления на клик или другие события можно
использовать событие DOM click:
test('уведомление реагирует на клик', () => {
const onClickM ock = jest.fn();
const n = new Noty({ text: 'Кликни меня', callbacks: { onClick: onClickMock }, timeout: false }).show();
const element = document.querySelector('.noty_bar');
element.dispatchEvent(new MouseEvent('click', { bubbles: true }));
expect(onClickMock).toHaveBeenCalled();
});
Это позволяет убедиться, что события DOM корректно пробрасываются в callbacks Noty.
Для предотвращения накопления уведомлений между тестами важно удалять их после каждого кейса:
afterEach(() => {
document.querySelectorAll('.noty_bar').forEach(el => el.remove());
});
Это обеспечивает изоляцию тестов и предотвращает ложноположительные результаты.
Noty позволяет настраивать анимации, положение и тему. Пример проверки кастомной позиции и темы:
test('уведомление создается с кастомной позицией и темой', () => {
const n = new Noty({
text: 'Кастомное уведомление',
layout: 'topRight',
theme: 'mint',
timeout: false
}).show();
const element = document.querySelector('.noty_bar');
expect(element.classList.contains('topRight')).toBe(true);
expect(element.classList.contains('noty_theme_mint')).toBe(true);
});
В SPA-фреймворках уведомления часто создаются динамически через компоненты. Для их тестирования используется комбинация jsdom, jest и рендеринга компонента:
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';
test('уведомление появляется при действии', () => {
render(<MyComponent />);
document.querySelector('#triggerButton').click();
expect(document.querySelector('.noty_bar')).not.toBeNull();
});
Такой подход позволяет проверять уведомления в контексте реального компонента.
Юнит-тесты для уведомлений Noty включают проверку создания, типов, времени жизни, callbacks, пользовательских взаимодействий и кастомных настроек. Правильная организация тестов с использованием jsdom и моков таймеров обеспечивает надёжную проверку поведения уведомлений без запуска браузера.