我如何验证是否没有发生任何事情?
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 框架进行模拟。如果是这种情况,您可以执行以下两项操作之一。
- 您可以在严格模式下创建模拟
- 您可以预期,当调用
plugin.Build(..)
方法时会抛出异常。
这里问了一个类似的问题:How to verify that method was NOT called in Moq?
编辑:
我模拟了您所看到的确切场景,并将其缩小到您正在迭代的数据类型。由于您使用的是列表,我猜是列表的一些内部工作导致了这个问题。我更改了对数组的所有列表引用,并按预期返回了分支覆盖率。
我们正在使用 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 框架进行模拟。如果是这种情况,您可以执行以下两项操作之一。
- 您可以在严格模式下创建模拟
- 您可以预期,当调用
plugin.Build(..)
方法时会抛出异常。
这里问了一个类似的问题:How to verify that method was NOT called in Moq?
编辑: 我模拟了您所看到的确切场景,并将其缩小到您正在迭代的数据类型。由于您使用的是列表,我猜是列表的一些内部工作导致了这个问题。我更改了对数组的所有列表引用,并按预期返回了分支覆盖率。