You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mock ES6类时Jest报错:无法读取undefined的'instances'属性

解决Jest Mock ES6类时出现TypeError: Cannot read property 'instances' of undefined的问题

我之前碰到过完全一样的坑!这个报错大概率是你的Cache模块导出方式和Jest自动mock的预期不匹配导致的,下面分几种常见情况给你排查和解决:

情况1:Cache是默认导出的ES6类

如果你的Cache模块是默认导出的类,比如:

// ../../../adapters/Cache.js
export default class Cache {
  // 类方法实现
}

那Jest自动mock后,mock对象会挂在default属性上,你直接访问Cache.mock自然会拿到undefined。修改测试代码如下:

jest.mock('../../../adapters/Cache')
const Fizz = require('../Fizz')
const Cache = require('../../../adapters/Cache')
// 关键:取default属性拿到真正的mock对象
const mockCache = Cache.default.mock
const fizz = new Fizz()

describe('CACHE', () => {
  it('should return a mock', () => {
    // 现在可以正常访问mock的instances等属性了
    expect(mockCache.instances.length).toBeGreaterThan(0)
  })
})

情况2:手动写mock工厂函数更稳妥

如果自动mock的行为不符合预期,你可以手动指定mock工厂函数,明确模拟ES6类的结构,这样能彻底避免导出方式的问题:

jest.mock('../../../adapters/Cache', () => {
  // 用jest.fn()模拟类本身,Jest会自动为它添加.mock属性
  return jest.fn().mockImplementation(() => {
    // 这里定义类实例的mock方法,按需添加
    return {
      get: jest.fn().mockResolvedValue('mock-data'),
      set: jest.fn().mockResolvedValue(true)
    }
  })
})

const Fizz = require('../Fizz')
const Cache = require('../../../adapters/Cache')
const fizz = new Fizz()

describe('CACHE', () => {
  it('should return a mock', () => {
    // 直接访问Cache.mock即可
    expect(Cache.mock.instances.length).toBe(1)
    // 还能验证实例方法的调用情况
    expect(Cache.mock.instances[0].get).toHaveBeenCalled()
  })
})

情况3:检查导入方式的一致性

还要确保你在Fizz模块里导入Cache的方式,和测试文件里的导入方式完全匹配。比如:

  • 如果Fizz里用的是import { Cache } from '../adapters/Cache'(命名导出),那测试里就要用const { Cache } = require('../../../adapters/Cache')
  • 如果Fizz里是import Cache from '../adapters/Cache'(默认导出),测试里用const Cache = require('../../../adapters/Cache')后,记得取.default

按上面的步骤排查,基本就能解决这个报错了!

内容的提问来源于stack exchange,提问作者AfterWorkGuinness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:01:11