2017-09-05 80 views
1

我们使用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

+0

你有没有测试过它的项目? – Nkosi

+0

是的,但'OpenCover'告诉我需要在那里再覆盖一个分支。 – kuskmen

+0

那么只需验证是否调用了'GetAvailablePlugins'。 – Nkosi

回答

1

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

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

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

编辑: 我模拟了您所看到的确切的情况,我已经把范围缩小到你迭代的数据类型。由于你使用的是一个列表,我猜想列表中有一些内部工作正在导致这个问题。我将所有列表引用都更改为数组,并按预期方式返回分支覆盖。

+0

这就是我想的,但不是愚蠢的..做模拟,不使用它,然后验证它的方法不叫...有点觉得多余,但我想这是唯一的方法 – kuskmen

+0

我'我不熟悉OpenCover告诉你的分支机构覆盖范围,但是它确实感到多余。它并不觉得有必要测试该路径,因为当foreach集合为空时,foreach不会执行循环块。 –

+0

难道是你缺少的测试是什么时候.GetAvailablePlugins()返回null? –