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
相关产品推荐
相关产品推荐

