javascriptlocal-storagefetch-mock

TypeError: Cannot set property localStorage of #<Window> which has only a getter


I am mocking localStorage in unitests like

function storageMock() {
    var storage = {};
    ....
}

and setting localStorage like

window.localStorage = localStorageMock()

It was working fine until, I have updated Node to 10.15.1.

It is throwing error that TypeError: Cannot set property localStorage of #<Window> which has only a getter.

Any idea that how I can mock localStorage and set it to window.localStorage.

P.S I am getting answers like setItem and getItem on localStorage, is there any way that I can set whole localStorage at once.


Solution

  • Add

    Object.defineProperty(window, 'localStorage', {
      value: storageMock
    });
    

    Full example:

    const localStorageMock = (() => {
      let store = {};
    
      return {
        getItem(key) {
          return store[key] || null;
        },
        setItem(key, value) {
          store[key] = value.toString();
        },
        removeItem(key) {
          delete store[key];
        },
        clear() {
          store = {};
        }
      };
    })();
    
    Object.defineProperty(window, 'localStorage', {
      value: localStorageMock
    });
    
    window.localStorage.setItem("KEY", "INPUT")