如何在NestJS单元测试中禁用@Transactional装饰器?
解决NestJS单元测试中禁用@Transactional装饰器的问题
方案1:正确Mock typeorm-transactional 模块
直接mock整个模块时,需确保@Transactional装饰器被替换为无操作的空装饰器,同时mock初始化相关函数避免CLS报错。在测试文件顶部添加以下代码:
jest.mock('typeorm-transactional', () => ({ Transactional: () => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => descriptor, initializeTransactionalContext: jest.fn(), patchTypeORMRepositoryWithBaseRepository: jest.fn(), }));
这段代码会让@Transactional装饰器直接返回原方法的描述符,相当于完全不生效,同时把初始化类函数设为空mock,规避CLS相关报错。
方案2:测试前动态替换装饰器实现
若方案1无效,可在测试用例执行前手动覆盖Transactional装饰器的逻辑:
import { Transactional } from 'typeorm-transactional'; beforeAll(() => { // 将Transactional改为空装饰器,不做任何事务包装 (Transactional as any) = () => (target: any, key: string, desc: PropertyDescriptor) => desc; });
方案3:测试环境跳过事务初始化
如果项目启动时调用了initializeTransactionalContext(),可在app.module.ts中添加环境判断,跳过测试环境的初始化:
import { initializeTransactionalContext } from 'typeorm-transactional'; if (process.env.NODE_ENV !== 'test') { initializeTransactionalContext(); }
配合前面的装饰器mock,即可彻底在单元测试中禁用事务功能。
内容的提问来源于stack exchange,提问作者Mirlo
相关产品推荐
相关产品推荐

