
在 nestjs 单元测试中,`configservice` 返回 `undefined` 是因测试模块未正确导入 `configmodule`,导致 `.env` 文件未被加载;需显式配置或使用 mock 替代。
当你在 NestJS 应用中使用 @nestjs/config 模块读取 .env 变量(如 TEST_VAR=ASD)时,在主应用中调用 ConfigModule.forRoot() 能正常加载环境变量——但单元测试默认不继承应用级模块配置。你当前的测试代码:
providers: [ConfigService, AppService],
仅注册了 ConfigService 实例,却未加载 ConfigModule,因此 ConfigService 无法访问 .env 文件,get('TEST_VAR') 始终返回 undefined。
✅ 正确做法:在测试模块中导入 ConfigModule
修改 app.controller.spec.ts,显式导入并配置 ConfigModule:
import { Test, TestingModule } from '@nestjs/testing';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
imports: [
// ✅ 关键:启用 ConfigModule 并自动加载 .env
ConfigModule.forRoot({
isGlobal: true, // 推荐设为 true,避免重复 import
cache: true, // 可选:提升性能
}),
],
controllers: [AppController],
providers: [AppService], // ConfigService 会自动由 ConfigModule 提供
}).compile();
appController = app.get(AppController);
});
describe('Test variable', () => {
it('should return "ASD"', () => {
expect(appController.getTest()).toBe('ASD');
});
});
}); ⚠️ 注意事项:.env 文件必须位于项目根目录(即 process.cwd() 所在路径),ConfigModule.forRoot() 默认从此处读取;不要手动 providers: [ConfigService] —— 它应由 ConfigModule 自动提供;若使用 isGlobal: true,则子模块无需重复 imports: [ConfigModule];确保已安装 dotenv(@nestjs/config 已将其列为 peer dependency,通常 npm install @nestjs/config 会自动满足)。
? 更推荐:使用 Mock 避免依赖真实环境
为提升测试隔离性与可维护性,建议对 ConfigService 进行 Mock,而非加载真实配置:
beforeEach(async () => {
const configServiceMock = {
get: jest.fn((key: string) => {
if (key === 'TEST_VAR') return 'ASD';
return undefined;
}),
};
const app: TestingModule = await Test.createTestingModule({
controllers: [AppController],
providers: [
AppService,
{
provide: ConfigService,
useValue: configServiceMock,
},
],
}).compile();
appController = app.get(AppController);
}); 这种方式不依赖文件系统、无环境耦合、执行更快,且能精准控制各测试场景下的返回值(例如测试 undefined 边界情况)。
✅ 总结
| 场景 | 推荐方案 |
|---|---|
| 快速验证配置逻辑(非核心业务) | 在 TestBed 中 imports: [ConfigModule.forRoot()] |
| 生产级单元测试(推荐) | Mock ConfigService,解耦环境、提升稳定性与可读性 |
| E2E 测试 | 使用真实 ConfigModule,贴近运行时行为 |
只要确保测试模块显式加载配置模块或合理 Mock,this.configService.get('TEST_VAR') 就不会再返回 undefined。










