2017-09-05 81 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? –