Pumbaa80'in cevabına yaptığım yorumu ayrı bir cevap olarak tekrar etmeye karar verdim, böylece onu bir kütüphane olarak yeniden kullanmak daha kolay olacak.
Pumbaa80'in kodunu aldım, biraz geliştirdim, testler ekledim ve burada bir npm modülü olarak yayınladım:
https://www.npmjs.com/package/mock-local-storage .
İşte bir kaynak kodu:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Bazı testler:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Modül, global nesne üzerinde sahte localStorage ve sessionStorage oluşturur (pencere veya global, hangisi tanımlıdır).
Diğer projemin testlerinde bunu mocha ile gerekli kıldım: mocha -r mock-local-storage
test edilen tüm kodlar için genel tanımları kullanılabilir hale getirmek için.
Temel olarak, kod aşağıdaki gibi görünür:
(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));
Aracılığıyla eklenen tüm yöntemlerin Object.defineProperty
yinelenmeyeceğini, erişilmeyeceğini veya normal öğeler olarak kaldırılmayacağını ve uzunluk olarak sayılmayacağını unutmayın. Ayrıca, bir öğe nesneye konulmak üzereyken çağrılan geri aramayı kaydetmenin bir yolunu ekledim. Bu geri arama, testlerde kota aşımı hatasını taklit etmek için kullanılabilir.
Profit!