[英]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.