当我尝试如下 mock 一个React组件的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");

并将以下代码用于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 });

最佳答案

我通过添加带有以下内容的安装环境脚本文件来完成用于 session 存储以进行商店测试的操作:
Object.defineProperty(window, 'sessionStorage', { value: {}, writable: true });
然后,package.json文件如下所示:

"jest": {
    "setupTestFrameworkScriptFile": "jest/jest-setupTestFrameworkScriptFile.js",
}

我实际上并没有说服您在最新版本的jest中需要此设置,但是自更早版本以来,我就一直使用此设置。

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

09-25 19:23