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

Nest.js测试无法覆盖Provider且报找不到src/trips/trip.entity模块错误

问题根因

你遇到的报错和Provider覆盖逻辑无关,是Jest测试环境默认无法解析TypeScript配置的src/开头的绝对路径别名导致的:你的真实StatsService里用了src/前缀的导入语句,测试阶段加载真实StatsService代码时,Jest找不到对应路径的文件。
另外你现有测试代码存在冗余配置:先注册真实StatsService再覆盖的写法,会触发真实StatsService的文件加载,进而触发导入报错。

解决方案

按优先级从高到低排列:

方案1:修改测试配置,避免加载真实StatsService

你测试的是StatsController,完全不需要引入真实的StatsService,直接将mock对象作为自定义Provider注册即可,既减少冗余,又不会触发真实服务的导入解析:

// 修改stats.controller.spec.ts的测试模块配置
beforeEach(async () => {
  const mockStatsService = {
    // 可以按需补充Controller用到的两个方法的mock实现
    getWeeklyStats: jest.fn(),
    getMonthlyStats: jest.fn()
  };
  const module: TestingModule = await Test.createTestingModule({
    controllers: [StatsController],
    providers: [
      {
        provide: StatsService,
        useValue: mockStatsService
      }
    ],
  }).compile();
  controller = module.get<StatsController>(StatsController);
});

方案2:配置Jest识别绝对路径别名

如果你后续需要编写StatsService本身的单元测试,必须加载真实服务代码的话,修改Jest配置(通常在项目根目录的jest.config.js或者package.json的jest字段中),添加路径映射规则:

// jest.config.js 新增配置
module.exports = {
  // 其余原有配置保持不变
  moduleNameMapper: {
    "^src/(.*)$": "<rootDir>/$1"
  }
}

注意:如果你的项目是Monorepo结构,需要根据你的目录结构调整<rootDir>对应的路径,确保映射后路径和实际文件路径匹配。

方案3:替换绝对导入为相对导入

将StatsService里所有src/开头的导入改为相对路径导入,比如:

// 原导入
import { Trip } from 'src/trips/trip.entity';
// 修改为对应层级的相对导入
import { Trip } from '../../trips/trip.entity';

该方案改造成本高,仅适合小型项目临时使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:03