我如何验证是否没有发生任何事情?

How do I verify if something didn't happen?

我们正在使用 OpenCover 进行解决方案测试,我注意到

public async Task Build(ProcessorContext context)
{
    context.ResultBetSlip.Bets.Clear();

    // Here OpenCover tells me that I need to cover two branches
    // so I assume I need to verify that GetAvailablePlugins can be empty and
    // no Build method was called.
    // How do I do that?
    foreach (var plugin in _pluginFactory.GetAvailablePlugins())
    {
        await plugin.Build(context);
    }
}

现在我的测试看起来像那样

[Test]
public async Task Build_ShouldntEnterForeachWhenThereAreNoPluginsRegistered()
{
    // Arrange
    var pluginFactoryMock = new Mock<IBetSlipProcessorServicePluginFactory>();
    var sut = new BetSlipProcessorService(pluginFactoryMock.Object);
    pluginFactoryMock
        .Setup(pf => pf.GetAvailablePlugins())
        .Returns(new List<IBetSlipProcessorServicePlugin>());

    // Act
    await sut.Build(AutoFixtureSimplified.Create<ProcessorContext>());

    // Assert
    ???
}

如果可能的话,我是否应该考虑测试这种情况?

编辑

根据要求,这是测试覆盖率报告:

在这里您可以找到我为实现这种覆盖率所做的所有测试的要点。 https://gist.github.com/kuskmen/df3f112b2b6d880741ee6ab559d64d53

我假设您正在使用 Moq 框架进行模拟。如果是这种情况,您可以执行以下两项操作之一。

  1. 您可以在严格模式下创建模拟
  2. 您可以预期,当调用 plugin.Build(..) 方法时会抛出异常。

这里问了一个类似的问题:How to verify that method was NOT called in Moq?

编辑: 我模拟了您所看到的确切场景,并将其缩小到您正在迭代的数据类型。由于您使用的是列表,我猜是列表的一些内部工作导致了这个问题。我更改了对数组的所有列表引用,并按预期返回了分支覆盖率。