Javascript 如何编写代码包含localstorage.get/localstorage.set的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

我正在尝试编写一个Jest测试用例,其中代码涉及本地存储访问。 运行测试用例时,无法说出无法读取属性

当涉及到
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()