मैंने अपनी टिप्पणी को Pumbaa80 के उत्तर के लिए अलग उत्तर के रूप में दोहराने का फैसला किया ताकि लाइब्रेरी के रूप में इसका पुन: उपयोग करना आसान हो जाए।
मैंने Pumbaa80 का कोड लिया, इसे थोड़ा परिष्कृत किया, परीक्षण जोड़े और इसे एक npm मॉड्यूल के रूप में यहां प्रकाशित किया:
https://www.npmjs.com/package/mock-local-storage ।
यहाँ एक स्रोत कोड है:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
कुछ परीक्षण:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
मॉड्यूल ग्लोबल ऑब्जेक्ट (विंडो या ग्लोबल, उनमें से कौन परिभाषित है) पर मॉक लोकलस्टोरेज और सेशनस्टोरेज बनाता है।
मेरी अन्य परियोजना के परीक्षणों में मुझे इसके साथ मोचा की आवश्यकता थी: mocha -r mock-local-storage
परीक्षण के तहत सभी कोड के लिए वैश्विक परिभाषा उपलब्ध कराना।
मूल रूप से, कोड इस प्रकार दिखता है:
(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));
ध्यान दें कि सभी विधियों के माध्यम से जोड़ा गया है Object.defineProperty
ताकि वे नियमित आइटम के रूप में पुनरावृत्त, एक्सेस या हटाए नहीं जाएंगे और लंबाई में गणना नहीं करेंगे। इसके अलावा, मैंने कॉलबैक को पंजीकृत करने का एक तरीका जोड़ा, जिसे तब कहा जाता है जब किसी वस्तु को ऑब्जेक्ट में डाला जाना है। यह कॉलबैक परीक्षण में त्रुटि से अधिक कोटा का अनुकरण करने के लिए इस्तेमाल किया जा सकता है।
Profit!