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

如何在Jest测试NestJS应用前自动启停Docker中的NATS服务?

使用Jest测试NestJS模块时自动管理Docker中的NATS服务器

当然可以实现,你可以通过testcontainers库结合Jest的全局生命周期钩子,在测试启动时自动拉起Docker中的NATS容器,测试结束后自动销毁,具体步骤如下:

1. 安装必要依赖

首先安装testcontainers及其NATS扩展包,用于在测试中管理Docker容器:

npm install --save-dev testcontainers @testcontainers/nats

2. 配置Jest全局生命周期钩子

在项目根目录创建jest.global-setup.ts文件,用于全局控制NATS容器的启动与停止:

import { NatsContainer, StartedNatsContainer } from '@testcontainers/nats';

let natsContainer: StartedNatsContainer;

export default async function globalSetup() {
  // 启动NATS容器,默认使用官方NATS镜像
  natsContainer = await new NatsContainer().start();

  // 将容器的NATS连接地址注入环境变量,供测试模块读取
  process.env.NATS_URL = `nats://${natsContainer.getHost()}:${natsContainer.getMappedPort(4222)}`;
}

export async function globalTeardown() {
  // 所有测试完成后停止并销毁容器
  await natsContainer.stop();
}

接着修改jest.config.js,将上述钩子配置到Jest中:

module.exports = {
  // 保留原有Jest配置...
  globalSetup: './jest.global-setup.ts',
  globalTeardown: './jest.global-setup.ts',
};

3. 在测试模块中对接自动启动的NATS

编写NestJS模块测试时,直接读取环境变量中的NATS地址配置客户端:

import { Test, TestingModule } from '@nestjs/testing';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { YourNatsDependentService } from './your-service';

describe('YourNatsDependentService', () => {
  let service: YourNatsDependentService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [
        ClientsModule.register([
          {
            name: 'NATS_CLIENT',
            transport: Transport.NATS,
            options: {
              servers: [process.env.NATS_URL],
            },
          },
        ]),
      ],
      providers: [YourNatsDependentService],
    }).compile();

    service = module.get<YourNatsDependentService>(YourNatsDependentService);
  });

  it('should interact with NATS server correctly', async () => {
    // 编写具体测试逻辑,验证服务与NATS的交互行为
    const response = await service.invokeRpcMethod();
    expect(response).toBeDefined();
  });
});

4. 验证自动流程

执行测试命令:

npm run test

此时Jest会先启动NATS Docker容器,待所有测试用例执行完成后,自动停止并销毁该容器,全程无需手动干预。

额外配置说明

如果需要自定义NATS容器(如启用JetStream、指定镜像版本),可以在实例化容器时传入参数:

// 启用JetStream并使用指定版本的NATS镜像
natsContainer = await new NatsContainer('nats:2.10').withCommand(['--jetstream']).start();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:18:21