Javascript 如何编写代码包含localstorage.get/localstorage.set的Jest测试用例
我正在尝试编写一个Jest测试用例,其中代码涉及本地存储访问。 运行测试用例时,无法说出无法读取属性 当涉及到Javascript 如何编写代码包含localstorage.get/localstorage.set的Jest测试用例,javascript,jestjs,local-storage,Javascript,Jestjs,Local Storage,我正在尝试编写一个Jest测试用例,其中代码涉及本地存储访问。 运行测试用例时,无法说出无法读取属性 当涉及到localstorage.getItem()时,我们需要以什么方式编写jest测试用例 function myLocal(){ var value= localStorage.getItem('slot').time return value } 在上面运行示例代码时,Jest抛出下面的错误 TypeError:无法读取null的属性“time” 使您的功能可测试: function
localstorage.getItem()
时,我们需要以什么方式编写jest测试用例
function myLocal(){
var value= localStorage.getItem('slot').time
return value
}
在上面运行示例代码时,Jest抛出下面的错误
TypeError:无法读取null的属性“time”
使您的功能可测试:
function getTime(storage) {
var value = storage.getItem('slot').time
return value
}
然后在应用程序中使用它,如下所示:
getTime(localStorage);
const mockGetItem = jest.fn();
mockGetItem.mockReturnValue({time: '16:00'});
expect(getTime({getItem: mockGetItem})).toBe('16:00');
expect(mockGetItem).toHaveBeenCalledWith('slot');
然后像这样测试它:
getTime(localStorage);
const mockGetItem = jest.fn();
mockGetItem.mockReturnValue({time: '16:00'});
expect(getTime({getItem: mockGetItem})).toBe('16:00');
expect(mockGetItem).toHaveBeenCalledWith('slot');
使您的功能可测试:
function getTime(storage) {
var value = storage.getItem('slot').time
return value
}
然后在应用程序中使用它,如下所示:
getTime(localStorage);
const mockGetItem = jest.fn();
mockGetItem.mockReturnValue({time: '16:00'});
expect(getTime({getItem: mockGetItem})).toBe('16:00');
expect(mockGetItem).toHaveBeenCalledWith('slot');
然后像这样测试它:
getTime(localStorage);
const mockGetItem = jest.fn();
mockGetItem.mockReturnValue({time: '16:00'});
expect(getTime({getItem: mockGetItem})).toBe('16:00');
expect(mockGetItem).toHaveBeenCalledWith('slot');
你可以像嘲笑其他东西一样嘲笑它。这个例子取自一些较旧版本的
jest-preset-angular
,我认为:
const mock=()=>{
let存储:{[key:string]:string}={};
返回{
getItem:(键:字符串)=>(存储中的键?存储[键]:null),
setItem:(键:字符串,值:字符串)=>(存储[键]=值| |“”),
removeItem:(键:字符串)=>删除存储[key],
清除:()=>(存储={})
};
};
defineProperty(窗口,'localStorage',{value:mock()});
defineProperty(窗口,'sessionStorage',{value:mock()});
代码中没有更改。当然,您必须先设置要获取的项目
更新:
我刚刚注意到您使用的是纯JavaScript,而不是TypeScript。在这种情况下,您必须修改模拟:
const mock = function() {
const storage = {};
return {
getItem: (key) => (key in storage ? storage[key] : null),
setItem: (key, value) => (storage[key] = value || ''),
removeItem: (key) => delete storage[key],
clear: () => (storage = {})
};
};
此外,您在评论中发布的示例没有可用的窗口
对象,因此您可能还必须模拟该对象:
const window = {
localStorage: mock();
};
// or if you only use localStorage without window, this might suffice:
localStorage = mock();
你可以像嘲笑其他东西一样嘲笑它。这个例子取自一些较旧版本的
jest-preset-angular
,我认为:
const mock=()=>{
let存储:{[key:string]:string}={};
返回{
getItem:(键:字符串)=>(存储中的键?存储[键]:null),
setItem:(键:字符串,值:字符串)=>(存储[键]=值| |“”),
removeItem:(键:字符串)=>删除存储[key],
清除:()=>(存储={})
};
};
defineProperty(窗口,'localStorage',{value:mock()});
defineProperty(窗口,'sessionStorage',{value:mock()});
代码中没有更改。当然,您必须先设置要获取的项目
更新:
我刚刚注意到您使用的是纯JavaScript,而不是TypeScript。在这种情况下,您必须修改模拟:
const mock = function() {
const storage = {};
return {
getItem: (key) => (key in storage ? storage[key] : null),
setItem: (key, value) => (storage[key] = value || ''),
removeItem: (key) => delete storage[key],
clear: () => (storage = {})
};
};
此外,您在评论中发布的示例没有可用的窗口
对象,因此您可能还必须模拟该对象:
const window = {
localStorage: mock();
};
// or if you only use localStorage without window, this might suffice:
localStorage = mock();
你好@Markus Dresch。尝试了您的解决方案,但出现了一些错误,请检查此问题并为我提供一个运行示例。请问您遇到了哪些错误?看,我用纯javascript版本更新了这篇文章。由于某种原因,没有看到标签和您的示例,抱歉。您好@Markus Dresch。尝试了您的解决方案,但出现了一些错误,请检查此问题并为我提供一个运行示例。请问您遇到了哪些错误?看,我用纯javascript版本更新了这篇文章。由于某种原因,我没有看到标签和您的示例,抱歉。感谢您的回答,但我看到相同的对象被克隆到与整个本地存储对象复制的所有项目。这没有问题。您不需要在应用程序的任何地方编写
getTime(localStorage)
,而是可以将其包装为:storage.getTime()
,其中存储是类或模块的实例。如果您将来想将数据存储在服务器而不是本地存储中,您只需更改storage.getTime()
的实现,谢谢您的回答,但我看到相同的对象被克隆到与整个本地存储对象重复的所有项中。这没有问题。您不需要在应用程序的任何地方编写getTime(localStorage)
,而是可以将其包装为:storage.getTime()
,其中存储是类或模块的实例。如果将来希望将数据存储在服务器而不是本地存储中,则只需更改storage.getTime()