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'svalidateClient并login使用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。
小智 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)