gpt4 book ai didi

c# - EventHub PartitionContext 类设计

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:31 25 4
gpt4 key购买 nike

我正在尝试测试 IEventProcessor 的实现。但是,我遇到了困难,因为不可能实际模拟 PartitionContext 类 ( https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitioncontext.aspx )。

例如,我无法验证 CheckpointAsync() 方法是否已正确调用,因为 ICheckpointer 接口(interface)是内部接口(interface),实际方法不是虚拟的。此外,我无法注入(inject)自己的 ICheckpointManager 实例,因为允许这样做的构造函数是内部的。

将所有内容都内部化的设计决策是什么,这将允许我模拟此类?

这要么是非常糟糕的设计,要么是我遗漏了一些东西。

最佳答案

是的,测试这一点需要做很多工作。这是要做的事情。

因此您创建了一个包装器:

public interface ICheckPointer
{
Task CheckpointAsync(PartitionContext context);
}

public class CheckPointer : ICheckPointer
{
public Task CheckPointAsync(PartitionContext context)
{
return context.CheckpointAsync();
}
}

在单元测试方法中,您现在可以模拟接口(interface)并检查是否调用了 CheckPointAsync

您的 IEventProcessor 实现现在应该接受 ICheckPointer 的实例:

public class SampleEventProcessor : IEventProcessor
{
private ICheckPointer checkPointer;

public SampleEventProcessor(ICheckPointer checkPointer)
{
this.checkPointer = checkPointer;
}

public Task OpenAsync(PartitionContext context)
{
return Task.FromResult<object>(null);
}

public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
{
...

await checkPointer.CheckpointAsync(context);
}

public async Task CloseAsync(PartitionContext context, CloseReason reason)
{
return Task.FromResult<object>(null);
}
}

您需要实现 IEventProcessorFactory 来注入(inject) ICheckPoint 接口(interface):

internal class SampleEventProcessorFactory : IEventProcessorFactory
{
private readonly ICheckPointer checkPointer;

public SampleEventProcessorFactory (ICheckPointer checkPointer)
{
this.checkPointer = checkPointer;
}

public IEventProcessor CreateEventProcessor(PartitionContext context)
{
return new SampleEventProcessor(checkPointer);
}
}

然后你像这样创建EventProcessor:

await host.RegisterEventProcessorFactoryAsync(new SampleEventProcessor(new CheckPointer()));

在单元测试中,您现在可以执行类似的操作(基于 NSubstitute):

var mock = Substitute.For<ICheckPointer>();
var sample = new SampleEventProcessor(mock);
await sample.ProcessEventsAsync(new PartitionContext(), null);
mock.Received().CheckPointAsync(Arg.Any<PartitionContext>());

警告:未编译代码,因此可能存在一些语法错误。至少它应该让您对如何继续进行有一个基本的了解。

关于c# - EventHub PartitionContext 类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com