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

如何在NestJS的Jest E2E测试中验证@Request注入的req.user值

在NestJS Jest E2E测试中验证req.user值的可行方案

以下是几种直接有效的实现方式,根据你的业务场景选择:

方案1:让控制器返回测试专用的用户标识

如果允许对业务代码做极小的测试兼容修改,可以在控制器方法中添加测试环境下的用户信息返回:

调整控制器代码

async create(@Request() req) {
  // 你的业务逻辑代码
  const result = await this.yourService.create(req.body, req.user);

  // 测试环境下附加用户信息(生产环境不会返回)
  if (process.env.NODE_ENV === 'test') {
    return { ...result, __testUser: { id: req.user.id, username: req.user.username } };
  }
  return result;
}

编写E2E测试

// 预先创建测试用户并生成对应JWT token
const testUser = await this.userService.create({ username: 'test-user', password: '123456' });
const token = await this.authService.generateToken(testUser);

// 发送请求并断言用户信息
const res = await request(app.getHttpServer())
  .post('/api/create') // 对应create方法的路由
  .set('Authorization', `Bearer ${token}`)
  .send({ /* 请求体数据 */ })
  .expect(201);

// 验证返回的测试用户信息与预期一致
expect(res.body.__testUser.id).toBe(testUser.id);
expect(res.body.__testUser.username).toBe(testUser.username);

方案2:使用测试专用拦截器(无业务代码侵入)

如果不想修改业务控制器,可以在测试模块中添加自定义拦截器,自动在响应中附加req.user信息:

定义测试拦截器

@Injectable()
export class TestUserInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const req = context.switchToHttp().getRequest();
    // 在响应中注入测试用用户数据
    return next.handle().pipe(
      map(response => ({ ...response, __testUser: req.user }))
    );
  }
}

在测试模块中配置拦截器

beforeEach(async () => {
  const moduleFixture = await Test.createTestingModule({
    controllers: [YourController],
    providers: [YourService],
  })
  // 全局注册测试拦截器
  .overrideProvider(APP_INTERCEPTOR)
  .useClass(TestUserInterceptor)
  .compile();

  app = moduleFixture.createNestApplication();
  await app.init();
});

执行测试断言

测试代码同方案1,直接断言res.body.__testUser的属性即可。

方案3:监控认证服务的验证逻辑

如果你的req.user是由Passport等认证库生成的,可以通过Jest Spy监控认证策略的validate方法,验证用户是否被正确解析:

编写测试代码

// 获取JWT策略实例并创建Spy
const jwtStrategy = app.get(JwtStrategy);
const validateSpy = jest.spyOn(jwtStrategy, 'validate').mockResolvedValue(testUser);

// 发送请求
await request(app.getHttpServer())
  .post('/api/create')
  .set('Authorization', `Bearer ${token}`)
  .send({ /* 请求体数据 */ })
  .expect(201);

// 验证validate方法被调用,且返回的用户正确
expect(validateSpy).toHaveBeenCalled();
expect(validateSpy.mock.results[0].value).toEqual(testUser);

关键注意事项

  • 确保测试用的JWT token对应真实存在的测试用户,测试前需初始化数据库数据(可使用测试数据库或事务回滚)
  • 若使用数据库,建议在每个测试用例前后清理数据,避免干扰

内容的提问来源于stack exchange,提问作者sai krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:52:40