Saya memutuskan untuk mengulangi komentar saya atas jawaban Pumbaa80 sebagai jawaban terpisah agar lebih mudah untuk digunakan kembali sebagai perpustakaan.
Saya mengambil kode Pumbaa80, memperbaikinya sedikit, menambahkan tes dan menerbitkannya sebagai modul npm di sini:
https://www.npmjs.com/package/mock-local-storage .
Berikut ini kode sumbernya:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Beberapa tes:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Modul membuat localStorage dan sessionStorage tiruan pada objek global (jendela atau global, yang mana yang ditentukan).
Dalam pengujian proyek saya yang lain, saya memerlukannya dengan mocha seperti ini: mocha -r mock-local-storage
untuk membuat definisi global tersedia untuk semua kode yang diuji.
Pada dasarnya, kode terlihat seperti berikut:
(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));
Perhatikan bahwa semua metode ditambahkan melalui Object.defineProperty
sehingga tidak akan diulang, diakses atau dihapus sebagai item biasa dan tidak akan dihitung panjangnya. Juga saya menambahkan cara untuk mendaftarkan callback yang dipanggil ketika sebuah item akan dimasukkan ke dalam objek. Callback ini dapat digunakan untuk meniru kesalahan kuota terlampaui dalam pengujian.
Profit!