Unit testing 如何使用sinon对本地存储进行单元测试

Unit testing 如何使用sinon对本地存储进行单元测试,unit-testing,reactjs,sinon,enzyme,sinon-chai,Unit Testing,Reactjs,Sinon,Enzyme,Sinon Chai,我正在尝试使用sinon测试localStorage。基本上,我对单元测试非常陌生,所以这可能是非常基本的 更新 我设法想出了这个,但现在它给了我一个新的错误应该包装对象的属性 测试 describe('Initial State', () => { it('should set the initial state for the component', () => { const props = { currentUser: {} };

我正在尝试使用sinon测试
localStorage
。基本上,我对单元测试非常陌生,所以这可能是非常基本的

更新

我设法想出了这个,但现在它给了我一个新的错误
应该包装对象的属性

测试

describe('Initial State', () => {
    it('should set the initial state for the component', () => {
const props = {
        currentUser: {}
      };
      sinon.stub(window.localStorage, 'setItem');
      window.localStorage.setItem('none', 'nothing');
    });
  });
您可以在所有测试中使用以模拟版本替换localStorage

我就是这样使用它的:

import {unauth, signOut, __RewireAPI__} from 'modules/auth/actions';

const rewrite = __RewireAPI__.__Rewire__;

const local = {}; // object where you store all values localStorage needs to return
const storage = {
  get(key) {
    return local[key];
  },
  set: sinon.spy(),
  remove: sinon.spy()
};

rewrite('storage', storage); // rewrite storage package with your mocked version

// in you test add values you want to get from localStorage
local.credentials = constants.CREDENTIALS;
local.authToken = constants.TOKEN;

我设法解决了它。感谢@anoop,因为他的回答是有帮助的,但我不得不通过一个主要的解决办法来管理它。 我正在使用jsdom,它目前不支持
localStorage
。我在我的jsdom配置中添加了一个假的

if (!global.window.localStorage) {
  global.window.localStorage = {
    getItem() { return '{}'; },
    setItem() {}
  };
}
并断言:

it('should fetch from local storage', () => {
      const props = {
        currentUser: 'UMAIR',
        user: {
          is_key: false
        }
      };

      const spy = sinon.spy(global.window.localStorage, "setItem");
      spy(props);
      expect(spy.calledWith( {
        currentUser: 'UMAIR',
        user: {
          is_key: false
        }
      }));
      spy.restore();

      const stub = sinon.stub(global.window.localStorage, 'getItem');
      stub(props);
      expect(stub.calledWith(Object.keys(props)));
// stub.restore();
    });
另见:

一周前,我还发现了与此相关的
Sinon
内部问题,但该问题已得到解决

见:


希望这对某人有所帮助。

@anoop我已经经历过了。之前,我使用相同的过程测试了
位置
对象,并且测试结果良好。然而,在这种情况下,它给我
试图将未定义的属性setItem包装为函数
@DmitriyNevzorov同意,没有必要。但是,如果我不测试它,所有其他测试都会失败,并抛出一个未定义
localStorage
的错误。这可能是对的,但我试图实现的是用全局对象手动模拟它。类似于global.window={localStorage:{。。