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

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:抽离公共配置避免代码重复(推荐)

如果后续有多个测试文件需要用到相同的全局配置,可以把配置逻辑抽成公共函数统一管理:

  1. 新增公共配置文件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'],
    }),
  );
  // 其他全局配置比如全局管道、守卫都可以放在此处统一管理
}
  1. 修改项目启动的main.ts中的bootstrap函数:
import { setupApp } from './setup-app';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  setupApp(app); // 调用公共配置
  await app.listen(3000);
}
bootstrap();
  1. 测试文件中直接调用公共配置即可:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:45:05