gpt4 book ai didi

c# - 如何使用 EventDataBatch 和 EventHubProducerClient 对 Azure EventHub 进行单元测试

转载 作者:行者123 更新时间:2023-12-03 00:54:29 27 4
gpt4 key购买 nike

我有一个业务代码,可以在数据库中查找更改(候选),并通过 EventHubProducerClient 将它们发布(发送)到 azure 事件中心,但在单元测试中发现,在引入 EventDataBatch 在 中工作时,我的候选正确发布非常困难发布限制。

我曾经只是模拟客户端并 stub EventHubProducerClient 的 SendAsync 捕获(实际上我有一个自定义匹配器,但实际上它只是为了比较的目的而捕获)发送的 EventData 以确保我的候选人正确出去。

但是当我的批处理达到 1M 发送事件限制时,我想利用 EventDataBatch 来确保我保持在限制以下。然而,我发现 EventDataBatch 相当令人沮丧,因为它是密封的,而且所有有趣的东西(比如像 AmqpProducer https://github.com/Azure/azure-sdk-for-net/blob/6011385c397ffa881d9d7e6bf8c448ad4ee47665/sdk/eventhub/Azure.Messaging.EventHubs/src/Amqp/AmqpProducer.cs#L233 这样的事件)都是内部方法......所以缺少验证计数......我真的无能为力在使用反射之外做一些事情(这就是我最终所做的)。

我在这里错过了什么吗?或者这只是 v4 到 v5 升级中的一个过度站点(其中 ToEnumerable() 被删除到 EventDataBatch 上)

我发现的最接近的是EventHubProducerClient unit testing in c#但似乎答案跳过了 EventDataBatch 单元可测试性问题的重要细微差别。

最佳答案

对于单元测试,您需要通过 EventHubsModelFactory 创建批处理。它的EventDataBatch method接受List<EventData>该批处理将用作后备存储。每个事件 TryAdd接受将被放置在该列表中。

示例:

var eventLimit = 3;
var store = new List<EventData>();

var batch = EventHubsModelFactory.EventDataBatch(
5,
store,
tryAddCallback: _ => store.Count < eventLimit);

while (store.Count < eventLimit)
{
var eventData = new EventData("Test")
{
MessageId = store.Count.ToString()
};

Assert.That(
() => batch.TryAdd(eventData),
Is.True,
$"The batch contains { store.Count } events; adding another should be permitted.");
}

Assert.That(
store.Count,
Is.EqualTo(eventLimit),
"The batch should be at its limit.");

Assert.That(
() => batch.TryAdd(new EventData("Too many")),
Is.False,
"The batch is full; it should not be possible to add a new event.");

for (var index = 0; index < eventLimit; ++index)
{
Assert.That(
store.Any(eventData => eventData.MessageId == index.ToString()),
Is.True,
$"The message for { index } should be in the batch.");
}

AsEnumerable方法已在 Azure.Messaging.EventHubs 中删除因为该批处理不保留对原始 EventData 的引用接受时的实例。由于必须将其序列化为 AMQP 格式才能测量其大小,因此批处理保留对该序列化版本的引用。这样就可以避免在发布时多次支付连载费用。如果事件的属性在被接受到批处理中后发生更改,它还可以通过禁止其数据发生变化来确保维持批处理的完整性。这对于确保TryAdd的尺寸测量和结果是必要的。是准确的。

关于c# - 如何使用 EventDataBatch 和 EventHubProducerClient 对 Azure EventHub 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73299792/

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