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

时间:2016-06-30 15:20:21

标签: 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");

并使用以下代码进行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 });

2 个答案:

答案 0 :(得分:3)

我已经通过添加以下内容的安装环境脚本文件来完成商店测试的会话存储;

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

然后package.json文件看起来像;

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

我实际上并不相信你在最新版本的jest中需要这个,但是我已经使用过这个设置,因为它的版本更早。

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

sessionStorage = {};

答案 1 :(得分:1)

我在项目package.json中使用了这个:

"jest": {
  "setupFiles": ["<rootDir>/app/mock/localStorageMock.js"]
}