【发布时间】:2019-07-29 19:40:25
【问题描述】:
您好,我正在开发 C# 应用程序。我正在为控制器级别编写单元测试用例。下面是我的控制器代码。
public IActionResult TriggerProductEventCheck([FromQuery(Name = "timeout-secs")] int timeoutS = 120)
{
int productEventsCount = 0;
if (productService.ProcessingEnabled)
{
var cts = new CancellationTokenSource();
cts.CancelAfter(timeoutS * 1000);
lock (SyncObject)
{
this.consumerClient.Subscribe(this.productEventTopicName);
while (!cts.IsCancellationRequested)
{
var productEvent = this.eventDispatcher.Consume();
long kafkaOffSet = productEvent.Offset.Value;
Product product = new Product(productEvent, log);
if (product.Options == null)
{
break;
}
if (product != null)
{
productService.ProcessProductEvents(product, kafkaOffSet);
}
productEventsCount++;
}
}
}
下面是我的单元测试用例。
public void ShouldReturnIfNoSQSEvents()
{
var productEventController = MockProvider.Target<ProductEventController>();
productEventController.GetDependency<IProductEventService>().ProcessingEnabled.Returns(true);
productEventController.GetDependency<IEventDispatcher>().Consume().Returns(new Confluent.Kafka.ConsumeResult<string, Avro.Generic.GenericRecord>());
productEventController.GetDependency<IConsumerClient>().Subscribe("test");
var productclass = Substitute.For<Product>();
var response = productEventController.Target.TriggerProductEventCheck() as JsonResult;
((int)response.StatusCode).ShouldBe(200);
}
每当我在单元测试用例之上运行时,控制进入 Product product = new Product(productEvent, log);我想模拟这条特定的线。我可以知道如何处理这种情况吗?任何帮助,将不胜感激。谢谢
【问题讨论】:
-
嗨,我正在使用 Substitute。
-
你在哪里设置
this.eventDispatcher。也许在控制器构造函数中? -
是的,首先我添加了私有只读 IEventDispatcher eventDispatcher;然后在构造函数中我添加了参数 IEventDispatcher eventDispatcher。然后在构造函数中我添加了 this.eventDispatcher = eventDispatcher;
-
我在启动时在 ConfigureServices 方法中注册我的所有服务。这是 .Net 核心提供的默认 IOC 容器,如果我没记错的话。比如services.AddSingleton
()里面的startup; -
嗨..如果您需要更多详细信息,请告诉我。