Unit testing 如何使用sinon对本地存储进行单元测试
我正在尝试使用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: {} };
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:{。。