.NET Grpc单元测试调用上下文

jtw3ybtb  于 2023-01-22  发布在  .NET
关注(0)|答案(1)|浏览(162)

我正在使用Grpc.CoreProtoBuf.Grpc包,因为我想同时使用这两个包:使用gRPC ClientFactory编写第一个gRPC代码。现在我有了一个Task<Response> MyMethod(Request request, CallContext context)的接口,其中CallContext来自ProtoBuf.Grpc
在接口的实现中,我获得授权(调用)用户,如下所示:

var user = httpContext.User.Claims.Where(x => x.Type == JwtRegisteredClaimNames.Name).FirstOrDefault();

现在我想对MyMethod的实现进行单元测试,但是我不知道如何为CallContext创建正确的上下文。
如何在CallContext中使用预定义的用户测试我的MyMethod实现?

    • 编辑:**

似乎可以通过调用构造函数来创建和传递CallContext的示例

public CallContext(object server, ServerCallContext context)

我可以通过TestServerCallContext.Create()创建ServerCallContext对象,参见here。但是我不知道object server传递什么。有人能给我一个例子吗?

vngu2lb8

vngu2lb81#

对于带有身份验证和用户上下文的gRPC单元测试,我的解决方案是以下方法:

public static ProtoBuf.Grpc.CallContext TestCallContext(Guid user)
{
    var serverCallContext = TestServerCallContext.Create(
                                            method: nameof(IGrpcGreetingService.Greeting)
                                        , host: "localhost"
                                        , deadline: DateTime.Now.AddMinutes(30)
                                        , requestHeaders: new Metadata()
                                        , cancellationToken: CancellationToken.None
                                        , peer: "10.0.0.25:5001"
                                        , authContext: null
                                        , contextPropagationToken: null
                                        , writeHeadersFunc: (metadata) => Task.CompletedTask
                                        , writeOptionsGetter: () => new WriteOptions()
                                        , writeOptionsSetter: (writeOptions) => { }
                                        );

    var claims = new[] {
            new Claim(JwtRegisteredClaimNames.Sub, "some subject"),
            new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
            new Claim(JwtRegisteredClaimNames.Name, user.ToString())
        };
    var claimsIdentity = new ClaimsIdentity(claims);

    var httpContext = new DefaultHttpContext();
    httpContext.User = new ClaimsPrincipal(claimsIdentity);
    serverCallContext.UserState["__HttpContext"] = httpContext;

    return new ProtoBuf.Grpc.CallContext("", serverCallContext);
}

TestServerCallContext.Create的参数来自here
也许这可以帮助别人保存一些小时或几天:)

相关问题