Как смоделировать localStorage, который работает с Object.keys (localStorage)? - PullRequest
0 голосов
/ 21 февраля 2020

Я могу смоделировать базовый c localStorage в шутливом тесте так:

// localStorage.js    
export default new class {
    store = {};
    setItem = (key, val) => (this.store[key] = val);
    getItem = key => this.store[key];
    removeItem = key => { delete this.store[key]; };
    clear = () => (this.store = {});
}();

// xxx.test.js
import localStorage from './localStorage';
window.localStorage = localStorage;

Однако, он не будет работать для насмешки над чем-то вроде Object.keys(localStorage), который должен вернуть ключи в localStorage в массиве. Пожалуйста, помогите.

Спасибо.

1 Ответ

0 голосов
/ 13 марта 2020

Вы можете использовать JavaScript Прокси объект для достижения способности Object.keys().

Например

index.js:

class FakeLocalStorage {
  store = {};
  setItem = (key, val) => (this.store[key] = val);
  getItem = (key) => this.store[key];
  removeItem = (key) => {
    delete this.store[key];
  };
  clear = () => (this.store = {});
}

let fakeLocalStorage = new FakeLocalStorage();
fakeLocalStorage = new Proxy(fakeLocalStorage, {
  ownKeys: (target) => {
    return Object.keys(target.store);
  },
  getOwnPropertyDescriptor(k) {
    return {
      enumerable: true,
      configurable: true,
    };
  },
});

(async function test() {
  fakeLocalStorage.setItem('name', 'TS');
  fakeLocalStorage.setItem('age', 23);
  const keys = Object.keys(fakeLocalStorage);
  console.log('keys:', keys);
})();

Результаты выполнения:

keys: [ 'name', 'age' ]
...