Работа с 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 для всех данных.clear и del обеспечивает
изоляцию тестов и предотвращает непредсказуемое поведение.