4

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

更新

我设法想出了这个,但现在它给了我一个新的错误Should wrap property of object

测试

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');
    });
  });
4

2 回答 2

8

我设法解决了它。感谢@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();
    });

另请参阅: 如何在 JavaScript 单元测试中模拟 localStorage?

https://github.com/gor181/webpack-react-babel-mocha-boilerplate/tree/master/test/utils

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

见:https ://github.com/sinonjs/sinon/issues/1129

希望这可以帮助某人。

于 2016-08-16T10:15:54.150 回答
2

您可以在所有测试中使用babel-plugin-rewire将 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;
于 2016-08-15T10:56:34.410 回答