Сброс состояния хранилища между тестами

Работа с IndexedDB напрямую может быть громоздкой из-за необходимости создавать транзакции и управлять версиями базы данных. Библиотека Idb-keyval значительно упрощает взаимодействие с IndexedDB, предоставляя удобный интерфейс для сохранения и извлечения данных через простые функции get, set, del и clear. Одной из важных практик при тестировании кода, использующего хранилище, является обеспечение чистого состояния между тестами. Это позволяет избежать влияния предыдущих тестов на последующие и гарантирует корректность результатов.


Основные методы работы с хранилищем

Idb-keyval предоставляет следующие ключевые функции:

  • set(key, value, storeName) — сохраняет значение value по ключу key в хранилище storeName. Если storeName не указан, используется стандартное хранилище по умолчанию.
  • get(key, storeName) — извлекает значение по ключу key. Если ключ отсутствует, возвращает undefined.
  • del(key, storeName) — удаляет запись по ключу key.
  • clear(storeName) — полностью очищает выбранное хранилище.

Для тестов метод clear является основным инструментом сброса состояния между тестами.


Организация сброса хранилища в тестовой среде

Чтобы гарантировать, что каждый тест начинается с чистого состояния, рекомендуется очищать хранилище до и после выполнения теста. На практике это достигается с помощью хуков тестового фреймворка, например Jest или Mocha.

Пример с Jest:

import { clear } from 'idb-keyval';

beforeEach(async () => {
  await clear();
});

afterEach(async () => {
  await clear();
});
  • beforeEach — очищает хранилище перед каждым тестом, обеспечивая старт с пустой базы.
  • afterEach — очищает хранилище после теста, предотвращая утечки данных между тестами при параллельном запуске.

Для проектов с множеством хранилищ или кастомными storeName можно передавать их явно:

await clear('customStore');

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

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

describe('Работа с пользовательскими настройками', () => {
  beforeAll(async () => {
    await clear('userSettings');
  });

  afterAll(async () => {
    await clear('userSettings');
  });

  test('Сохраняем настройку темы', async () => {
    // тестовые действия
  });

  test('Сохраняем язык интерфейса', async () => {
    // тестовые действия
  });
});

Такой подход позволяет изолировать данные между разными наборами тестов, не затрагивая другие хранилища.


Сброс конкретных ключей вместо полного очищения

Иногда необходимо сохранять часть данных и очищать только отдельные ключи:

import { del } from 'idb-keyval';

beforeEach(async () => {
  await del('lastSession');
});

Использование del вместо clear минимизирует лишние операции и ускоряет выполнение тестов при больших объёмах данных.


Асинхронность операций и ожидание результата

Все методы Idb-keyval возвращают промисы. Игнорирование асинхронного характера может привести к состояниям гонки, когда тест начнётся до завершения очистки. Важно использовать await или возвращать промис в тестах:

test('Проверка сохранения данных', async () => {
  await set('user', { name: 'Alice' });
  const user = await get('user');
  expect(user.name).toBe('Alice');
});

Без await значения могут быть получены некорректно, что приведёт к нестабильным тестам.


Рекомендации по производительности

  • Очищать только необходимые хранилища вместо вызова глобального clear для всех данных.
  • Параллельное выполнение тестов требует отдельного хранилища для каждого потока или полного сброса между тестами.
  • Кэширование часто используемых значений можно проводить в памяти, чтобы не нагружать IndexedDB и ускорить тесты.

Выводы по практике сброса состояния

  • Использование clear и del обеспечивает изоляцию тестов и предотвращает непредсказуемое поведение.
  • Асинхронная природа методов требует корректного ожидания промисов.
  • Группировка тестов и использование отдельных хранилищ повышает надежность тестового окружения.
  • Соблюдение этих правил позволяет создавать стабильные и воспроизводимые тесты при работе с Idb-keyval.