【问题标题】:How to count # of events sent to event hub via Moq for Unit Testing如何计算通过 Moq 发送到事件中心的事件数以进行单元测试
【发布时间】:2018-02-24 07:13:44
【问题描述】:

我正在使用 MOCK (Moq) 为我的 Azure 事件中心 编写 单元测试。单元测试很简单。当我向我的事件中心发送 1 条消息时,我需要确保它确实收到了 1 条消息。这就是我正在做的……

Mock<IEventHub> eventHubMock;

eventHubMock
    .Setup( client => client.SendBatchAsync( It.IsAny<IEnumerable<EventData>>() ) )
    .Returns( Task.CompletedTask );

// Some processing which sends 1 message to Event Hub.

// Now to verify that my mock did receive 1 message.

eventHubMock.Verify(
    client => client.SendBatchAsync(
    It.IsAny<IEnumerable<EventData>>() ) );

问题

  1. 上面的内容只是验证它收到了一些 EventData。如何验证它是否收到了 1 个 EventData?
  2. 我还可以使用 Mock 执行哪些其他验证?
  3. 我的代码处理 2 个事件中心。如何确保将消息发送到正确的事件中心?

【问题讨论】:

  • 要验证您是否只通过了 1 个EventData,您可以像这样设置它:It.Is&lt;IEnumerable&lt;EventData&gt;&gt;(e =&gt; e.ToList().Count == 1)。规则是每个问题 1 个问题(?)。另外,你的第二个问题没有意义......
  • 当前状态下的问题不完整,因此不清楚。阅读How to Ask,然后阅读edit 问题,提供minimal reproducible example,可用于重现问题,从而更好地理解所问的问题。
  • 有一个额外的参数可以提供给验证,以说明您希望调用它的次数。试试eventHubMock.Verify( client =&gt; client.SendBatch( your parameters here ), Times.Once);

标签: c# unit-testing mocking moq azure-eventhub


【解决方案1】:

你应该使用It.Is&lt;T&gt;(Expression)方法来做参数的验证:

eventHubMock.Verify(
    client => client.SendBatch(
        It.Is<IEnumerable<EventData>>(es => es.Count() == 0 && IsValid(es.First()))));

IsValid(EventData eventData) 是一些帮助方法,用于检查您想要的有关事件的所有信息。

事件转到哪个事件中心是在您创建发送者时定义的,而不是在您使用它时定义的。所以检查应该与Some processing which sends 1 message to Event Hub块内发生的事情有关,现在很难给出任何细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多