Jest监视TypeORM Repository的update方法失败问题
解决Jest监视TypeORM Repository的update方法失败问题
问题原因
使用jest.mock('typeorm')自动生成的mock时,Repository的update方法未被正确模拟为函数,导致jest.spyOn无法识别该属性(返回undefined),而其他方法(如find、save)已被自动完成mock。
解决方案
方案1:手动模拟Repository类
替换自动mock为手动mock,确保包含update方法:
jest.mock('typeorm', () => { const actualTypeORM = jest.requireActual('typeorm'); return { ...actualTypeORM, // 手动mock Repository类,实现所有需要的方法 Repository: jest.fn().mockImplementation(() => ({ find: jest.fn(), findOne: jest.fn(), delete: jest.fn(), save: jest.fn(), update: jest.fn(), // 显式添加update方法的mock })), // 若需使用getRepository,同步mock该方法 getRepository: jest.fn().mockReturnValue(new actualTypeORM.Repository()), }; });
方案2:测试前手动赋值update方法
在测试初始化阶段,给someEntityRepository手动绑定mock的update函数:
beforeEach(() => { // 初始化仓库实例 someEntityRepository = new Repository<SomeEntity>(); // 为update方法绑定mock函数 someEntityRepository.update = jest.fn(); }); // 之后正常使用spyOn test('示例测试', () => { const updateSpy = jest.spyOn(someEntityRepository, 'update'); // ...测试逻辑 });
方案3:类型断言绕过类型检查(临时方案)
如果是TypeScript类型系统导致的识别问题,可通过类型断言让Jest识别update:
const updateSpy = jest.spyOn(someEntityRepository as unknown as { update: jest.Mock }, 'update');
说明
优先选择方案1或2,二者能确保mock的完整性,避免后续其他方法出现类似问题。手动mock可以更精准地控制TypeORM模块的行为,适配测试需求。
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

