NestJS E2E测试报错:未指定默认引擎且无扩展名提供
问题解答
是的,你需要在测试环境中手动配置视图引擎相关设置,因为通过Test.createTestingModule创建的Nest应用实例不会自动继承main.ts里的应用配置逻辑。
具体修改步骤
- 导入必要依赖:在
app.e2e-spec.ts中导入NestExpressApplication类型和join方法(来自path模块) - 添加视图引擎配置:在测试的
beforeEach钩子中,创建应用时指定类型为NestExpressApplication,并复制main.ts里的视图配置代码
修改后的app.e2e-spec.ts代码
import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication, NestExpressApplication } from '@nestjs/common'; import * as request from 'supertest'; import { join } from 'path'; import { AppModule } from './../src/app.module'; describe('AppController (e2e)', () => { let app: NestExpressApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); // 创建NestExpressApplication类型的实例 app = moduleFixture.createNestApplication<NestExpressApplication>(); // 复制main.ts中的视图配置 app.setBaseViewsDir(join(__dirname, '..', 'src', 'views')); app.setViewEngine('hbs'); await app.init(); }); it('/ (GET)', () => { return request(app.getHttpServer()) .get('/') .expect(200) .expect('Hello world!'); // 注意:与controller返回的message大小写保持一致 }); });
关键说明
- 测试环境的应用实例是独立创建的,不会自动执行
main.ts中的bootstrap函数,因此必须手动添加视图引擎、视图目录这类配置 - 注意调整视图目录的路径:测试文件通常位于
test目录下,所以路径需要改为join(__dirname, '..', 'src', 'views')(对应项目根目录下的src/views),确保能正确找到模板文件 - 检查断言文本的大小写:你的
app.controller.ts中返回的是'Hello world!',但原测试代码中断言的是'Hello World!',大小写不匹配也会导致测试失败,需要保持一致
内容的提问来源于stack exchange,提问作者IdanB
相关产品推荐
相关产品推荐

