Decidí reiterar mi comentario a la respuesta de Pumbaa80 como una respuesta separada para que sea más fácil reutilizarlo como biblioteca.
Tomé el código de Pumbaa80, lo refiné un poco, agregué pruebas y lo publiqué como un módulo npm aquí:
https://www.npmjs.com/package/mock-local-storage .
Aquí hay un código fuente:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Algunas pruebas:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
El módulo crea simulacro de almacenamiento local y almacenamiento de sesión en el objeto global (ventana o global, cuál de ellos está definido).
En las pruebas de mi otro proyecto lo requería con mocha como este: mocha -r mock-local-storage
hacer que las definiciones globales estén disponibles para todo el código bajo prueba.
Básicamente, el código tiene el siguiente aspecto:
(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));
Tenga en cuenta que todos los métodos agregados mediante Object.defineProperty
para que no se repitan, accedan o eliminen como elementos normales y no cuenten en longitud. También agregué una forma de registrar la devolución de llamada que se llama cuando un elemento está a punto de colocarse en un objeto. Esta devolución de llamada se puede utilizar para emular el error de superación de la cuota en las pruebas.
Profit!