如何在JEST中模拟localStorage.setIem和localStorage.removeItem

Nit*_*ila 6 javascript reactjs jestjs

当我试图模仿如下的笑话中的反应组件的localStorage时,

spyOn(window.localStorage,'removeItem');
window.localStorage.removeItem("key1");
window.localStorage.removeItem("key2");
expect(window.localStorage.removeItem).toHaveBeenCalledWith("key1");
expect(window.localStorage.removeItem).toHaveBeenCalledWith("key2");
Run Code Online (Sandbox Code Playgroud)

并使用以下代码进行localStorage模拟

let localStorageMock = (function() {
  var storage = {};

  return {
    setItem: function(key, value) {
      storage[key] = value || '';
    },
    getItem: function(key) {
      return storage[key] || null;
    },
    removeItem: function(key) {
      delete storage[key];
    },
    get length() {
      return Object.keys(storage).length;
    },
    key: function(i) {
      var keys = Object.keys(storage);
      return keys[i] || null;
    }
  };
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });
Run Code Online (Sandbox Code Playgroud)

Tim*_*lds 4

我已经通过添加带有以下内容的设置环境脚本文件来为存储测试的会话存储完成此操作:

Object.defineProperty(window, 'sessionStorage', { value: {}, writable: true });

package.json 文件看起来像;

"jest": {
    "setupTestFrameworkScriptFile": "jest/jest-setupTestFrameworkScriptFile.js",
}
Run Code Online (Sandbox Code Playgroud)

我实际上并不相信您在最新版本的 jest 中需要这个,但是我从更早的版本开始就使用了这个设置。

使用这种方法时,您需要注意的一件事是它可以在测试之间保留数据,因此您需要在 beforeEach 中添加以下内容;

sessionStorage = {};
Run Code Online (Sandbox Code Playgroud)