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
相关产品推荐
相关产品推荐

