Jest测试出现localForage.createInstance is not a function错误如何解决
报错根因
这个错误出现的核心原因是测试运行环境中,导入的localforage模块不是完整的官方导出对象:要么是模块被异常mock后丢失了createInstance方法,要么是测试环境(如jsdom)对IndexedDB相关API的兼容问题导致localforage初始化异常,最终暴露的对象不存在目标方法。
可行解决方案
方案1:全局mock localforage模块(适用于多测试文件依赖localforage的场景)
- 在你的测试目录下新建
__mocks__/localforage.js文件,写入以下mock内容:
const mockLocalForage = { createInstance: jest.fn(() => ({ driver: jest.fn(), getItem: jest.fn(() => Promise.resolve(null)), setItem: jest.fn(() => Promise.resolve()), removeItem: jest.fn(() => Promise.resolve()), clear: jest.fn(() => Promise.resolve()), length: jest.fn(() => Promise.resolve(0)), key: jest.fn(() => Promise.resolve(null)), keys: jest.fn(() => Promise.resolve([])), iterate: jest.fn(() => Promise.resolve()), })), INDEXEDDB: 'asyncStorage', // 可根据业务需求补充你用到的其他localforage常量和方法 } export default mockLocalForage
- 在jest配置(或单测试文件顶部)开启该mock:
jest.mock('localforage')
方案2:单测试文件内直接注入mock(适用于仅单个测试文件依赖该Context的场景)
在你编写测试用例的文件最顶部,写入以下mock代码,保证该代码执行顺序优先于你的组件和Context导入:
jest.mock('localforage', () => ({ createInstance: jest.fn(() => ({ getItem: jest.fn().mockResolvedValue(null), setItem: jest.fn().mockResolvedValue(undefined), // 补充你业务逻辑中用到的localforage实例方法 })), INDEXEDDB: 'indexedDB', }))
方案3:直接mock Context绕开localforage初始化(推荐,单元测试组件时最优解)
如果你的测试核心目标是验证组件逻辑而非localforage存储逻辑,完全可以直接绕过Context的真实初始化,传入mock的Context值即可:
import { FeatureContext } from '你的Context文件路径' import { render, screen } from '@testing-library/react' import TestComponent from '你的组件路径' test('测试组件逻辑', () => { const mockContextValue = { // 填入你的组件实际用到的Context中的属性和方法,全部用jest.fn()模拟即可 getStoreValue: jest.fn().mockResolvedValue('测试值'), setStoreValue: jest.fn().mockResolvedValue(undefined), } render( <FeatureContext.Provider value={mockContextValue}> <TestComponent /> </FeatureContext.Provider> ) // 后续编写你的测试断言逻辑即可 })
内容的提问来源于stack exchange,提问作者RocketMeister
相关产品推荐
相关产品推荐

