如何重置已被覆盖的jsDOM函数

How to reset jsDOM functions which has been overwritten

我开玩笑这样覆盖jsdom localstorage API,以测试我的try catch代码。

    Storage.prototype.setItem = jest.fn(() => {
        throw new Error("error");
    });

如何重置它的实现?

我目前正在做这个。有更简洁的方法吗?

    const setImplementation = Storage.prototype.setItem;
    Storage.prototype.setItem = jest.fn(() => {
        throw new Error("error");
    });
    expect(() => {
        localStorageHelper.setData(key, value);
    }).not.toThrow();
    Storage.prototype.setItem = setImplementation;
    done();

永远不要通过赋值来模拟对象方法,因为它们无法通过这种方式恢复。手动恢复它们是在重新发明轮子,因为这可以由 Jest 处理:

jest.spyOn(Storage.prototype, 'setItem').mockImplementation(() => {
    throw new Error("error");
});

像这样的模拟应该与 jest.restoreAllMocks()restoreMock 配置选项一起使用,以便在不影响其他测试的情况下持续恢复。