Я вирішив повторити свій коментар до відповіді Pumbaa80 як окрему відповідь, щоб було простіше використовувати його як бібліотеку.
Я взяв код Pumbaa80, трохи уточнив його, додав тести і опублікував тут як модуль npm:
https://www.npmjs.com/package/mock-local-storage .
Ось вихідний код:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Деякі тести:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Модуль створює макет localStorage і sessionStorage на глобальному об'єкті (вікно або глобальний, хто з них визначений).
У інших тестах мого проекту я вимагав цього mocha -r mock-local-storage
зробити так, щоб зробити глобальні визначення доступними для всіх тестових кодів.
В основному код виглядає так:
(function (glob) {
function createStorage() {
let s = {},
noopCallback = () => {},
_itemInsertionCallback = noopCallback;
Object.defineProperty(s, 'setItem', {
get: () => {
return (k, v) => {
k = k + '';
_itemInsertionCallback(s.length);
s[k] = v + '';
};
}
});
Object.defineProperty(s, 'getItem', {
// ...
});
Object.defineProperty(s, 'removeItem', {
// ...
});
Object.defineProperty(s, 'clear', {
// ...
});
Object.defineProperty(s, 'length', {
get: () => {
return Object.keys(s).length;
}
});
Object.defineProperty(s, "key", {
// ...
});
Object.defineProperty(s, 'itemInsertionCallback', {
get: () => {
return _itemInsertionCallback;
},
set: v => {
if (!v || typeof v != 'function') {
v = noopCallback;
}
_itemInsertionCallback = v;
}
});
return s;
}
glob.localStorage = createStorage();
glob.sessionStorage = createStorage();
}(typeof window !== 'undefined' ? window : global));
Зауважте, що всі методи, додані через, Object.defineProperty
щоб їх не повторювали, не мали доступу та не видаляли як звичайні елементи та не враховували в довжину. Також я додав спосіб зареєструвати зворотний виклик, який викликається, коли елемент збирається ввести в об’єкт. Цей зворотний виклик може використовуватися для імітації перевищення квоти в тестах.
Profit!