Ich habe beschlossen, meinen Kommentar zur Antwort von Pumbaa80 als separate Antwort zu wiederholen, damit es einfacher ist, ihn als Bibliothek wiederzuverwenden.
Ich nahm den Code von Pumbaa80, verfeinerte ihn ein wenig, fügte Tests hinzu und veröffentlichte ihn hier als npm-Modul:
https://www.npmjs.com/package/mock-local-storage .
Hier ist ein Quellcode:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Einige Tests:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Das Modul erstellt Mock LocalStorage und SessionStorage für das globale Objekt (Fenster oder global, welches davon definiert ist).
In den Tests meines anderen Projekts habe ich es mit Mokka wie folgt benötigt: mocha -r mock-local-storage
um globale Definitionen für den gesamten getesteten Code verfügbar zu machen.
Grundsätzlich sieht Code wie folgt aus:
(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));
Beachten Sie, dass alle Methoden, die über hinzugefügt wurden, Object.defineProperty
damit sie nicht als reguläre Elemente iteriert, aufgerufen oder entfernt werden und nicht in der Länge zählen. Außerdem habe ich eine Möglichkeit hinzugefügt, einen Rückruf zu registrieren, der aufgerufen wird, wenn ein Element in ein Objekt eingefügt werden soll. Dieser Rückruf kann verwendet werden, um einen Fehler zu emulieren, bei dem das Kontingent überschritten wurde.
Profit!