C# NCover:从覆盖范围中排除不可执行的代码行
下面代码中的switch语句有一个C# NCover:从覆盖范围中排除不可执行的代码行,c#,unit-testing,code-coverage,ncover,C#,Unit Testing,Code Coverage,Ncover,下面代码中的switch语句有一个default子句,这是编译器所需要的,还有一个很好的保护,但它永远不会执行。在为其他所有内容编写测试之后,我无法(或应该)测试这一行。我不在乎我没有用测试覆盖这一行,但是我的TestDriven.net NCover代码覆盖率报告确实显示了未测试的行,这导致类覆盖率下降到86%。有没有办法让NCover只排除这一行 public static class OperandTypeExtensions { public static string ToSh
default
子句,这是编译器所需要的,还有一个很好的保护,但它永远不会执行。在为其他所有内容编写测试之后,我无法(或应该)测试这一行。我不在乎我没有用测试覆盖这一行,但是我的TestDriven.net NCover代码覆盖率报告确实显示了未测试的行,这导致类覆盖率下降到86%。有没有办法让NCover只排除这一行
public static class OperandTypeExtensions
{
public static string ToShortName(this OperandType type)
{
#region Contract
Contract.Requires<InvalidEnumArgumentException>(Enum.IsDefined(typeof(OperandType), type));
#endregion
switch (type)
{
case OperandType.None: return "<none>";
case OperandType.Int32: return "i32";
case OperandType.Int64: return "i64";
default:
throw new NotSupportedException();
}
}
}
公共静态类操作数类型扩展
{
公共静态字符串ToSortName(此操作数类型)
{
#区域合同
Contract.Requires(Enum.IsDefined(typeof(operationType),type));
#端区
开关(类型)
{
大小写操作数类型。无:返回“”;
大小写操作数类型.Int32:返回“i32”;
大小写操作数类型.Int64:返回“i64”;
违约:
抛出新的NotSupportedException();
}
}
}
我的问题与类似,但没有一个答案对我的具体情况有帮助。您可以通过将整数值强制转换为操作数类型来练习,该整数值在操作数类型枚举中不存在:
Assert.Throws<InvalidEnumArgumentException>(delegate { ((OperandType)Int32.MaxValue).ToShortName(); } );
这里应该有default
选项,因为如果将新值添加到operantype
enum,则您的契约将允许该值,但开关将不支持新选项
UPDATE2:如果您确实需要此方法的100%覆盖率和约定,请使用操作数类型。无作为默认选项:
public static class OperandTypeExtensions
{
public static string ToShortName(this OperandType type)
{
Contract.Requires<InvalidEnumArgumentException>(Enum.IsDefined(typeof(OperandType), type));
switch (type)
{
case OperandType.Int32: return "i32";
case OperandType.Int64: return "i64";
default:
return "<none>";
}
}
}
我还希望我的所有源文件都达到100%,不是%而是避免每次运行代码覆盖率工具时重复检查每个类是否存在误报
在本例和IMO中,如果功能是公共的,则表示,您应使用类似的方法对其进行测试:
Assert.Throws<NotSupportedException>( OperandTypeExtensions.ToShortName() );
使用此解决方案,在源代码中,它将在返回空字符串之前中断(在调试中),代码覆盖率将看到执行的Debug.Assert行
另外,我想知道是否有更好的解决方案,比如注释或专门禁用代码块的东西。我不能这样做,因为合同会阻止我在操作数类型
枚举中未定义的方法中添加任何值,这是应该的。我将得到一个InvalidEnumArgumentException
,该行仍然没有覆盖。确切地说,我应该使用default
,作为保护措施(如上所述)。契约肯定有一个好处:静态检查器可以验证没有人试图在方法中放入未定义的值,并且它会添加到该类型的文档中。(不指定参数上的契约
约束就像将所有参数都设置为对象类型
)。我认为这太过分了。如果您的方法需要操作数类型
的参数,那么谁会将不同的内容传递给您的方法呢?也许,我不同意。但关键是,我想要么涵盖抛出的,要么忽略它,或者其他一些创造性的解决方案。我只是不想在我的覆盖率结果中看到它,因为它会扭曲报告。+1对于第二次更新,添加一个检查枚举是否符合预期的测试
CollectionAssert.AreEquivalent(Enum.GetValues(typeof(OperandType)),
new OperandType[] { OperandType.Int32,
OperandType.Int64,
OperandType.None });
Assert.Throws<NotSupportedException>( OperandTypeExtensions.ToShortName() );
private string ToShortName(this OperandType type)
{
var result = "";
switch (type)
{
case OperandType.Int32: result = "i32";
case OperandType.Int64: result = "i64";
}
Debug.Assert(result != "", "Invalid type.");
return result;
}