Postanowiłem powtórzyć mój komentarz do odpowiedzi Pumby80 jako oddzielnej odpowiedzi, aby łatwiej było ponownie wykorzystać ją jako bibliotekę.
Wziąłem kod Pumba80, nieco go dopracowałem, dodałem testy i opublikowałem jako moduł npm tutaj:
https://www.npmjs.com/package/mock-local-storage .
Oto kod źródłowy:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Niektóre testy:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Moduł tworzy mock localStorage i sessionStorage na obiekcie globalnym (window lub global, który z nich jest zdefiniowany).
W testach mojego innego projektu wymagałem tego z mokką w ten sposób: mocha -r mock-local-storage
aby globalne definicje były dostępne dla całego testowanego kodu.
Zasadniczo kod wygląda następująco:
(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));
Zwróć uwagę, że wszystkie metody dodane za pośrednictwem, Object.defineProperty
aby nie były iterowane, otwierane ani usuwane jako zwykłe elementy i nie były liczone w długości. Dodałem również sposób rejestrowania wywołania zwrotnego, które jest wywoływane, gdy przedmiot ma zostać umieszczony w obiekcie. To wywołanie zwrotne może służyć do emulacji błędu przekroczenia limitu w testach.
Profit!