创建泛型类型参数的新实例,但不获取代码覆盖率

Jam*_*ass 8 c# visual-studio-2008

我通过代码覆盖运行我的代码,下面的行显示1块未覆盖.

谁能告诉我该行的哪一部分没有执行?

在此输入图像描述

一个例子:

public abstract class Base
{
    public abstract IExample CreateEntity<TExample>() where TExample : IExample, new();
}

public class Class1 : Base
{
    public override IExample CreateEntity<TExample>()
    {
        IExample temp = new TExample();
        return temp;
    }
}

public interface IExample
{

}

public class TEx : IExample
{

}
Run Code Online (Sandbox Code Playgroud)

和测试方法

    [TestMethod]
    public void TestMethod1()
    {
        Class1 ex = new Class1();
        ex.CreateEntity<TEx>();
    }
Run Code Online (Sandbox Code Playgroud)

Joh*_*ner 6

更改约束以强制TExample成为类:

public abstract IExample CreateEntity<TExample>() where TExample : class, IExample, new();
Run Code Online (Sandbox Code Playgroud)

如果您通过ILSpy之类的工具运行已编译的代码,您将看到未获得覆盖的块:

TExample temp = (default(TExample) == null) ? Activator.CreateInstance<TExample>() : default(TExample);
return temp;
Run Code Online (Sandbox Code Playgroud)

它正在执行检查以查看传递给泛型的类型是引用类型还是值类型.通过强制它成为一个类,将删除此检查.在此处阅读有关默认关键字的更多信息:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

获得完整代码覆盖率的另一种方法是使用实​​现的结构IExample:

public struct S1 : IExample
{ 
}
Run Code Online (Sandbox Code Playgroud)

然后添加此测试:

[TestMethod]
public void StructTest()
{
    Class1 ex = new Class1();
    ex.CreateEntity<S1>();
}
Run Code Online (Sandbox Code Playgroud)