尝试为 c# 实现 gRPC 单元测试

Trying to implement gRPC unit test for c#

我一直在尝试在 Internet 上或任何地方寻找有关如何在 C# 中实施 gRPC 单元测试的示例,但我无法找到任何东西,或者我可能只是看不到东西。

如果有人能指出正确的方向,我将不胜感激。

S

对于简单的一元服务,只要你没有对 gRPC headers、取消等做任何有趣的事情——你应该能够处理你的服务器类型 就像服务类型 - 创建一个实例,调用简单的一元方法,检查结果。但是,这不会验证编组或 gRPC 层等。对于 that,您确实需要集成测试。同样,任何涉及流媒体的事情都可能需要集成测试,因为有很多后台管道。如果这是我,我会简单地创建一个服务器作为 test-fixture,然后通过创建一个可以与这些服务对话的真正客户端来编写我的测试。

如果你使用的是 Google 服务器代码,像 the fixture I'm using here 这样的代码应该可以(不用担心 AddCodeFirst - 那是一些 protobuf-net.grpc添加;只需使用您在真实服务器中使用的相同注册码)。如果您需要使用 Microsoft 服务器代码进行测试,则需要将 Kestrel 作为 fixture 托管在进程中;但幸运的是:它们 大部分 完全可以互换,所以如果有疑问:使用更简单的一个。请注意,在客户端:同样,由于 gRPC 的想法是在 languages/runtimes/frameworks 之间透明地互操作,因此 应该无关紧要 客户端是使用 Microsoft 还是 Google 运输。从历史上看,存在一些细微差别,但它们是 a:非常小众,b:发现后修复。

我经常这样做

1:我为服务创建了一个接口来测试 DI 系统或者能够模拟它。我这样做是为了向框架 kinde-does-that 注册 gRPC 服务,并且它的创建类似于控制器

然后我这样写我的测试:

[TestMethod]
public async Task Call_Grpc_Method_Test()
{
    var grpcService = _service.GetRequiredService<IMyService>();

    var request = new MyRequest {When=DateTime.Now.AddDays(30)};
    
    var context = TestServerCallContext.Create(
                                             method: nameof(IMyService.WinningLotteryNumbers)
                                            , 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 answer= await grpcService.WinningLotteryNumbers(request, context);
    Assert.IsNotNull(answer);

}

IMyService 是我想要测试的 gRPC 服务,我只是创建了一个 IServiceProvider,它可以通过实际实现为我构建一个,使其成为集成测试,或者通过模拟 objects 使其成为单元测试。

TestServerCallContext class 位于 NuGet 包 Grpc.Core.Testing 中,您需要将其添加到您的测试项目中。

至于构造函数,您可以像我演示的那样使用硬编码示例数据,或者花式添加元数据 headers 和 authcontex 以及您需要的东西...

如您所见,一旦开始并不难;-)