我们正在使用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
答案 0 :(得分:1)
我假设您正在使用Moq框架进行模拟。如果是这种情况,你可以做两件事之一。
plugin.Build(..)
方法时会抛出异常。此处提出了类似的问题:How to verify that method was NOT called in Moq?
编辑: 我模拟了您正在看到的确切场景,并将其缩小到您正在迭代的数据类型。由于您使用的是列表,我猜测列表中存在导致此问题的一些内部工作原理。我将所有列表引用更改为数组,并按预期返回分支覆盖率。