私は、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
では、テスト対象のすべてのコードでグローバル定義を使用できるようにするために、モカを次のように必要としました。
基本的に、コードは次のようになります。
(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!