나는 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
모듈은 전역 개체 (창 또는 전역, 정의 된 창)에 모의 localStorage 및 sessionStorage를 만듭니다.
내 다른 프로젝트의 테스트에서는 테스트 mocha -r mock-local-storage
중인 모든 코드에 대해 전역 정의를 사용할 수 있도록하기 위해 mocha와 함께 필요했습니다 .
기본적으로 코드는 다음과 같습니다.
(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!