mockRestore无法清除jest.spyOn().mockImplementation创建的mock该如何处理?
问题原因
mockRestore()仅对原始的spy实例生效,你在afterAll中重新执行jest.spyOn(Date, 'now')会创建一个全新的spy实例,和beforeAll里创建的原spy没有关联,调用新实例的mockRestore()自然无法恢复原生Date.now实现jest.clearAllMocks()只会清除mock的调用记录、入参和返回值记录,不会恢复被mock覆盖的原生方法,对你的场景没有作用
正确实现代码
把创建的spy实例存储在变量中,直接调用原始实例的mockRestore()即可:
// 提前声明变量存储原始spy实例 let dateNowSpy: jest.SpyInstance; beforeAll((): void => { // 将创建的spy赋值给变量 dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1626764400000); }); afterAll((): void => { // 调用原始spy的恢复方法 dateNowSpy.mockRestore(); });
备选兼容方案
如果不想维护spy变量,也可以在收尾阶段直接手动还原原生实现:
afterAll((): void => { Date.now = jest.requireActual('Date').now; });
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

