【问题标题】:Unit Test event hub EventProcessor单元测试事件中心 EventProcessor
【发布时间】:2015-08-12 03:43:04
【问题描述】:

我目前正在学习 Microsoft 事件中心,并遵循示例代码 here。我更改了ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events) 方法,以便现在在获得EventData 后,将其存储到数据库中。现在,我想使用单元测试来测试我的代码。在测试类中,我设置了一个发送者并以初始化方法将数据发送到事件中心,这部分工作完美。然后我创建一个新的测试方法来测试接收端。代码如下所示:

[TestMethod]
public void TestProcessEventsAsync()
{
    //Initialize the receiver, and run it
    Receiver receiver = new Receiver();
    Receiver r = new Receiver(eventHubName, connectionString);
    r.MessageProcessingWithPartitionDistribution();

    //check if the data is stored in the database
    ...
}

在这里,我只是创建了一个新的接收器实例,并使用它来处理发送到事件中心的数据。我只将三个对象发送到事件中心,其中两个使用相同的分区。测试失败,输出显示并非所有分区都已初始化,这意味着接收器在处理完所有数据之前就停止了。

我猜测,由于MessageProcessingWithPartitionDistribution() 方法将任务划分为多个线程,因此单元测试无法以这种方式工作。所以我的问题是如何通过单元测试来测试这个MessageProcessingWithPartitionDistribution() 方法?

感谢任何帮助!

【问题讨论】:

  • 您的测试中是否有任何逻辑等待事件中心接收三个消息并保存它们?否则,EventProcessorHost 有可能在它有机会处理您的消息之前被销毁......
  • 我在将消息发送到事件中心之后和接收者开始处理消息之前使用了Thread.Sleep(30000)。所以我认为当处理器想要处理数据时,数据已经在事件中心了。

标签: c# unit-testing azure-eventhub


【解决方案1】:

为了确保 EventProcessor 在您签入测试中的数据库之前完全关闭,您应该调用:

r.UnregisterEventProcessor();

这应该确保所有待处理的消息都得到处理,并且 EventProcessor 执行受控关闭。

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 2021-11-06
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多