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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:29:59