.NET集成测试中HotChocolate的IRequestExecutor Mock身份验证配置问题
问题根因
你使用的微软官方Mock身份验证方案是基于ASP.NET Core中间件管道实现的,仅处理通过HTTP路由进入的请求。直接调用IRequestExecutor执行查询时会绕开整个中间件管道,所以AuthHandler不会触发,身份信息自然也不会流入上下文。
方案1:直接向GraphQL请求注入Mock用户(推荐,性能更高,纯单元测试风格)
你可以直接把构造好的Mock ClaimsPrincipal 传入GraphQL请求的上下文数据中,HotChocolate执行器会直接识别这个用户身份:
[Fact] public async Task GetJokes() { // 构造Mock用户 var mockUser = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "test-user-id"), new Claim(ClaimTypes.Name, "test-user"), // 按需添加你需要的角色、权限Claim new Claim(ClaimTypes.Role, "Admin") }, "TestAuthentication")); var query = @"query Jokes { jokes(jokeLength: SMALL) { nodes { id body } } }"; var request = QueryRequestBuilder.New() .SetQuery(query) // 把Mock用户注入到GraphQL上下文,固定键名用HotChocolate预定义的即可 .SetProperty(HotChocolate.AspNetCore.WellKnownContextData.User, mockUser) .Create(); var executor = await _factory.Services.GetRequestExecutorAsync(); var result = await executor.ExecuteAsync(request); (await result.ToJsonAsync()).MatchSnapshot(); }
如果多个测试都需要Mock用户,可以封装个扩展方法简化调用。
方案2:走HTTP请求管道(复用现有Mock Auth配置)
如果你不想改现有身份验证逻辑,也可以直接用WebApplicationFactory创建的HttpClient发送GraphQL请求,请求会走完整的ASP.NET Core中间件链路,你之前配置的Mock AuthHandler就会正常触发:
[Fact] public async Task GetJokes() { var client = _factory.CreateClient(); var query = new { query = @"query Jokes { jokes(jokeLength: SMALL) { nodes { id body } } }" }; var response = await client.PostAsJsonAsync("/graphql", query); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); result.MatchSnapshot(); }
两种方案都可以满足需求,方案1更适合只测GraphQL业务逻辑的场景,方案2更贴近真实用户调用链路。
内容的提问来源于stack exchange,提问作者Kieran Osgood
相关产品推荐
相关产品推荐

