J'ai décidé de réitérer mon commentaire sur la réponse de Pumbaa80 en tant que réponse séparée afin qu'il soit plus facile de le réutiliser comme bibliothèque.
J'ai pris le code de Pumbaa80, je l'ai raffiné un peu, j'ai ajouté des tests et je l'ai publié en tant que module npm ici:
https://www.npmjs.com/package/mock-local-storage .
Voici un code source:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Quelques tests:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Le module crée un mock localStorage et sessionStorage sur l'objet global (window ou global, lequel d'entre eux est défini).
Dans les tests de mon autre projet, je l'ai exigé avec mocha comme ceci: mocha -r mock-local-storage
pour rendre les définitions globales disponibles pour tout le code sous test.
Fondamentalement, le code ressemble à ceci:
(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));
Notez que toutes les méthodes ajoutées via Object.defineProperty
afin qu'elles ne soient pas répétées, consultées ou supprimées en tant qu'éléments normaux et ne comptent pas dans leur longueur. J'ai également ajouté un moyen d'enregistrer le rappel qui est appelé lorsqu'un élément est sur le point d'être placé dans l'objet. Ce rappel peut être utilisé pour émuler une erreur de dépassement de quota dans les tests.
Profit!