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

时间:2017-09-05 13:50:35

标签: c# .net unit-testing mocking opencover

我们正在使用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
    ???
}

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

编辑

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

我假设您正在使用Moq框架进行模拟。如果是这种情况,你可以做两件事之一。

  1. 您可以在严格模式下创建模拟
  2. 当调用plugin.Build(..)方法时会抛出异常。
  3. 此处提出了类似的问题:How to verify that method was NOT called in Moq?

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