下面是一个非常简单的jest单元测试,当运行它时,您将得到如下错误
无法对基元值执行spyOn;未定义给定
TypeError:无法读取未定义的属性"getItem"
但是根据this post的最后两个注解,localStorage和sessionStorage已经添加到最新的JSDOM和jest中。如果使用jest-localstorage-mock并将其添加到我的jest setupFiles中,则会看到如下奇怪的错误
类型错误:对象[methodName]. mockImplementation不是函数
因此,我的问题是,什么是最好的方式来模拟本地存储/会话存储在开玩笑。
describe('window.sessionStorage', () => {
let mockSessionStorage;
beforeEach(() => {
mockSessionStorage = {};
jest.spyOn(window.sessionStorage, "getItem").mockImplementation(key => {
return mockSessionStorage[key];
});
});
describe('getItem-', () => {
beforeEach(() => {
mockSessionStorage = {
foo: 'bar',
}
});
it('gets string item', () => {
const ret = window.sessionStorage.getItem('foo');
expect(ret).toBe('bar');
});
});
});
下面是我的jest配置
module.exports = {
verbose: true,
//setupFiles: ["jest-localstorage-mock"],
testURL: "http://localhost/"
};
4条答案
按热度按时间dtcbnfnu1#
这里的解决方案只使用
jestjs
和typescript
,仅此而已。index.ts
:index.spec.ts
:100%覆盖报告的单元测试结果:
以下是完整的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/51566816
hrirmatl2#
你可能根本不需要一个mock。只要像往常一样使用
window.sessionStorage
,并根据window.sessionStorage.getItem(...)
的结果来编写条件,而不是监视window.sessionStorage.setItem
。不要忘记像演示的那样在beforeEach
中调用window.sessionStorage.clear()
。来自Eric Burel的评论
kuhbmx9i3#
这对我来说与添加对象一起工作:
t1qtbnec4#
在使用
jest
的上下文中,这对我很有效: