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

NestJS使用Jest执行单元测试时依赖注入异常问题求助

解决NestJS单元测试中Jest无法解析CACHE_MANAGER依赖的问题

你的问题根源很明确:在单元测试的RootTestModule里,你只声明了AppService作为提供者,但AppService依赖的CACHE_MANAGER并没有被注册到测试模块中,所以Nest没办法自动注入它。下面给你两种实用的解决思路,你可以根据测试需求选择:

方法一:模拟(Mock)CACHE_MANAGER(推荐单元测试使用)

单元测试的核心是隔离被测对象(这里是AppService),不需要依赖真实的缓存服务。我们可以手动模拟一个CACHE_MANAGER的实现,让Nest能够完成注入:

修改你的app.controller.spec.ts文件,在providers数组中添加CACHE_MANAGER的模拟提供者:

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
// 别忘了导入CACHE_MANAGER
import { CACHE_MANAGER } from '@nestjs/common';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [
        AppService,
        {
          provide: CACHE_MANAGER,
          // 模拟缓存管理器的常用方法,如果你的Service用到了其他方法,也需要在这里添加模拟
          useValue: {
            get: jest.fn(),
            set: jest.fn(),
            del: jest.fn(),
          },
        },
      ],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

这种方式的优势在于完全隔离了外部依赖,测试速度快,而且后续如果需要测试缓存相关逻辑,还可以通过jest.fn()的断言方法,验证缓存方法是否被正确调用。

方法二:使用真实的CacheModule(适合集成测试)

如果你需要在测试中使用真实的缓存功能(比如测试缓存读写逻辑),可以直接在测试模块中导入CacheModule并注册:

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
// 导入CacheModule
import { CacheModule } from '@nestjs/common';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
      // 注册CacheModule,这里可以根据需要配置缓存存储(比如内存、Redis等)
      imports: [CacheModule.register()],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

注意:这种方式会启动真实的缓存服务,更适合集成测试场景,单元测试一般推荐使用方法一的模拟方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:32:32