我制作了一个可重用的自定义类,以帮助在单元测试期间模拟localStorage(受this blog post启发):
export class MockLocalStorage {
static mock(store = {}) {
const mockLocalStorage = {
getItem: (key: string): string => {
return key in store ? store[key] : null;
},
setItem: (key: string, value: string) => {
store[key] = `${value}`;
},
removeItem: (key: string) => {
delete store[key];
},
clear: () => {
store = {};
},
};
spyOn(localStorage, 'getItem').and.callFake(mockLocalStorage.getItem);
spyOn(localStorage, 'setItem').and.callFake(mockLocalStorage.setItem);
spyOn(localStorage, 'removeItem').and.callFake(mockLocalStorage.removeItem);
spyOn(localStorage, 'clear').and.callFake(mockLocalStorage.clear);
}
}
问题在于它使用了对spyOn
的某些调用,这些调用仅在单元测试期间定义。这会在构建过程中导致一些编译错误。
在这种情况下,我可以不用使用spyOn来重写它,但是由于我需要为单元测试创建其他可重用的类,因此我真的想有一个通用的方法在正常构建期间排除测试实用程序类。
即使文件不包含任何测试,也应使用.spec.ts
命名文件吗?
答案 0 :(得分:0)
只需将spyOn
函数声明为全局变量,您就可以安抚编译器:
declare var spyOn: Function;
答案 1 :(得分:0)
我终于发现,将测试实用程序文件放在项目根目录的test
文件夹中即可解决问题。