端到端测试中的 NestJS 模拟 JWT 身份验证

Cas*_*ano 14 authentication unit-testing mocking typescript nestjs

我想在 NestJS e2e(集成)测试中模拟 JWT 身份验证。我在我的业务逻辑中使用注入的令牌数据,并且我不想在我的测试代码中插入凭据。

我按照Nest authentication docs实现了 JWT 身份验证。我使用@User与示例中的装饰器类似的装饰器,并在我的业务逻辑中使用有关用户对象的信息。

@Post()
async myPostEndpoint(@Body() body: PostBody, @User() user: MyUser){
    // do stuff using user properties
}
Run Code Online (Sandbox Code Playgroud)

当按照Nest 测试文档中的指示使用 supertest 测试我的应用程序时,我不想发出真正的身份验证请求,因为我需要在我的版本控制系统中保留凭据。

我希望能够覆盖提供者以返回测试用户。却想不通。

我尝试覆盖AuthService'svalidateClientlogin使用Nest 测试文档overrideProvider + useClass/useFactory/useValue中的指示返回默认用户。我还尝试覆盖and 中的方法,但请求仍然返回 401 - Unauthorized。JwtStrategyLocalStrategy

Jay*_*iel 14

overrideGuard(AuthGuard('jwt')).useValue()您可以在您的函数中添加功能,canActivate()如下所示:

canActivate (context: ExecutionContext) => {
  const req = context.switchToHttp().getRequest();
  req.user = myCustomUserObject;
  return true;
}
Run Code Online (Sandbox Code Playgroud)

服务器要处理myCustomUserObject的预期值在哪里req.user

  • 为什么不使用测试用户并创建 JWT,我认为 e2e 测试应该接近真实应用程序 (3认同)
  • 从技术上讲,这将是更好的选择@MADforFUNandHappy,但由于问题是专门关于嘲笑警卫的,我想我会回答这个问题。 (2认同)

小智 8

对于使用 GraphQL 的人,我是这样做的:

const module: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    })
      .overrideGuard(JwtAuthGuard)
      .useValue({
        canActivate: (context: ExecutionContext) => {
          const ctx = GqlExecutionContext.create(context)
          ctx.getContext().req.user = { user_id: "abc123" } // Your user object
          return true
        },
      })
      .compile()
Run Code Online (Sandbox Code Playgroud)