【问题标题】:Unit Testing and Mocking SubscriberClient (Google Pub/Sub) in a C# ProjectC# 项目中的单元测试和模拟 SubscriberClient (Google Pub/Sub)
【发布时间】:2023-03-08 20:44:01
【问题描述】:

我在 .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)。

任何想法都将不胜感激。

【问题讨论】:

标签: c# unit-testing mocking google-cloud-pubsub


【解决方案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'”。我错过了什么吗?
  • 抱歉,你是对的,这个方法是内部的。我已经更正了答案。
猜你喜欢
  • 2019-07-26
  • 2023-03-03
  • 2022-01-13
  • 2011-04-11
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多