Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NCover:从覆盖范围中排除不可执行的代码行_C#_Unit Testing_Code Coverage_Ncover - Fatal编程技术网

C# NCover:从覆盖范围中排除不可执行的代码行

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

下面代码中的switch语句有一个
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;
}