【问题标题】:AfterAll Uncaught TypeError: localStorage.removeItem is not a function thrownAfterAll Uncaught TypeError: localStorage.removeItem 不是抛出的函数
【发布时间】:2020-03-19 11:18:07
【问题描述】:

我是 Angular 测试的新手,所以我测试了小事件和功能,但现在在测试时使用假的 localStorage,我在每个组件中都面临这个问题 localStorage.removeitem。我已经用谷歌搜索了这个问题,但无法获得最佳解决方案。任何人都可以帮助解决这个问题。

这就是我模拟本地存储进行测试的方式。

let store = {''}; // i have localData here

    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: () => {
            this.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);

【问题讨论】:

    标签: javascript angular testing jasmine karma-runner


    【解决方案1】:

    我不模拟localStorage,因为它位于窗口对象上,而且它的实现非常简单。嘲笑它可能会带来比需要更多的头痛。

    只要让localStorage 成为window 对象上的样子,如果您希望localStorage 在测试中保持新鲜,请在afterAll 挂钩中执行localStorage.clear();

    【讨论】:

    • 是的,但这会删除所有项目。我的观点是不要模拟localStorage,正确地使用它进行测试,一旦你在套件中使用它,在afterAll 钩子中,做localStorage.clear(),这样你就回到了一个干净的状态用于您的其他测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2019-11-06
    • 2017-09-18
    • 2020-06-05
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多