繁体   English   中英

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

[英]How to Unit Test Azure EventHub with EventDataBatch and EventHubProducerClient

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

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

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

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

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

对于单元测试,您需要通过EventHubsModelFactory创建批处理。 它的EventDataBatch 方法接受一个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.");
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM