C# 项目中的单元测试和模拟 SubscriberClient (Google Pub/Sub)

Posted

技术标签:

【中文标题】C# 项目中的单元测试和模拟 SubscriberClient (Google Pub/Sub)【英文标题】:Unit Testing and Mocking SubscriberClient (Google Pub/Sub) in a C# Project 【发布时间】:2021-04-11 10:26:15 【问题描述】:

我在 .NET Core 3.1 项目中使用 Google Cloud Pub/Sub (Google.Cloud.PubSub.V1 (2.2.0))。 我正在尝试为从 Google Pub/Sub 订阅中检索消息的代码编写单元测试。 我的代码与您在 Google 文档中找到的代码相似。

var subscriber = await SubscriberClient.CreateAsync(subscriptionName);

try

    var startTask = subscriber.StartAsync(async (PubsubMessage message, CancellationToken cancel) =>
    
            //code
    );
    
    await Task.Delay(5000);
    await subscriber.StopAsync(CancellationToken.None);
    await startTask;

catch (Exception ex)

        //code

有没有办法在单元测试中模拟 SubscriberClient? SubscriberClient 似乎没有接口。 我的单元测试使用 NUnit (3.12.0) 和 Moq (4.14.5)。

任何想法都将不胜感激。

【问题讨论】:

***.com/questions/42254974/… 【参考方案1】:

调用SubscriberClient.Create(...) 而不是.CreateAsync(...) 允许您传入底层SubscriberServiceApiClient 实例。

编辑:抱歉,以上不正确,应该是:

直接实例化SubscriberClientImpl,而不是调用SubscriberClient.CreateAsync(...)。这允许您传入底层的SubscriberServiceApiClient 实例。 请注意,您可以将new SubscriberClient.Settings() 传递给settings 参数,并将null 传递给shutdown 参数作为默认值。

SubscriberServiceApiClient 可以被模拟 - 可以直接模拟,也可以通过实例化 SubscriberServiceApiClientImpl 实例并传入模拟的 Subscriber.SubscriberClient

在测试时,请注意SubscriberClient 是多线程的,默认设置会调用从多个线程同时传递给StartAsync 的回调。

【讨论】:

嗨,克里斯。如果我将代码从 SubscriberClient.CreateAsync() 更改为 SubscriberClient.Create(),则会收到错误消息“无法在此处访问内部方法 'Create'”。我错过了什么吗? 抱歉,你是对的,这个方法是内部的。我已经更正了答案。

以上是关于C# 项目中的单元测试和模拟 SubscriberClient (Google Pub/Sub)的主要内容,如果未能解决你的问题,请参考以下文章

无法通过单元测试中的 Sitecore 上下文访问 Sitecore 模拟项目(MS Fakes)

您如何在 C# 中模拟文件系统以进行单元测试?

在 Typescript 单元测试中模拟

使用 IoC 进行单元测试

SonarQube 5.6 中的 C# 单元测试结果

.NET 中的单元测试:如何模拟实体数据提供者