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)的主要内容,如果未能解决你的问题,请参考以下文章