NestJS集成测试报错Cannot set property 'userId' of undefined求助
问题原因
你在bootstrap()启动函数中配置的cookie-session中间件,仅作用于正式启动的应用实例。测试场景下通过Test.createTestingModule创建的INestApplication实例,不会自动执行bootstrap()里的全局配置,因此测试环境的应用没有挂载cookie-session中间件,导致控制器中@Session()注入的session对象为undefined,赋值userId时触发报错,接口返回500,和你的测试预期201不符。
解决方案
方法1:直接在测试代码中补充中间件配置
修改测试文件的beforeEach逻辑,创建完app后手动挂载cookie-session,代码示例:
import * as cookieSession from 'cookie-session'; // 顶部引入依赖 describe('Authentication system', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); // 补充和bootstrap中一致的cookie-session配置 app.use( cookieSession({ keys: ['anything'], }), ); await app.init(); }); // 剩下的测试逻辑不变 it('/(POST)', () => { const email = 'khfkjdhsf@hot'; return request(app.getHttpServer()) .post('/signup') .send({ email, password: 'kasdhfkjdhfkj' }) .expect(201) .then((res) => { const { id, email } = res.body; expect(id).toBeDefined(); }); }); });
方法2:抽离公共配置避免代码重复(推荐)
如果后续有多个测试文件需要用到相同的全局配置,可以把配置逻辑抽成公共函数统一管理:
- 新增公共配置文件
src/setup-app.ts:
import { INestApplication } from '@nestjs/common'; import * as cookieSession from 'cookie-session'; export function setupApp(app: INestApplication) { app.use( cookieSession({ keys: ['anything'], }), ); // 其他全局配置比如全局管道、守卫都可以放在此处统一管理 }
- 修改项目启动的
main.ts中的bootstrap函数:
import { setupApp } from './setup-app'; async function bootstrap() { const app = await NestFactory.create(AppModule); setupApp(app); // 调用公共配置 await app.listen(3000); } bootstrap();
- 测试文件中直接调用公共配置即可:
import { setupApp } from '../src/setup-app'; // 引入公共配置 describe('Authentication system', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); setupApp(app); // 调用公共配置 await app.init(); }); // 测试逻辑保持不变 });
内容的提问来源于stack exchange,提问作者user16763075
相关产品推荐
相关产品推荐

