代码覆盖不会将使用 <T> 的行标记为已通过

Code coverage doesn't mark a line that uses <T> as passed

我不知道为什么我的代码覆盖率会出现这种行为,也许有人知道原因。 如您所知,代码覆盖率达到时为蓝色,未达到时为红色,部分达到代码行时为黄色。

我编写了一个小映射器,它接收 IDataReader 并通过反射变成对象。

internal IEnumerable<T> Convert<T>(System.Data.IDataReader dataReader) where T : new()
{
    var columns = this.GetColumns(dataReader); // get a list of column name... not important.
    var result = new List<T>();

    while (dataReader.Read())
    {
        var nuevoObjeto = new T();  // <-- this line is yellow in code coverage.

        foreach (var item in columns)
        {
            var pi = nuevoObjeto.GetType().GetProperty(item);

            pi.SetValue(nuevoObjeto, dataReader[columns.IndexOf(item)]);
        }

        result.Add(nuevoObjeto);
    }

    return result;
}

如您所见,黄线不是 IF 或 WHILE 等条件...只是一个简单的 "new T" 如果你调试这段代码,调试会很好地到达那一行,事实上测试是绿色的,有预期的结果。

测试执行此步骤。

  1. 伪造的 IDataReader(带有 nSubstitute)
  2. 数据读取器上只有 1 个结果。
  3. T 仅使用一个 TestClass 进行测试...例如 USERTEST。

希望有人知道为什么会这样... 谢谢!

也尝试使用 struct 对其进行测试,或向通用方法添加 class 约束 - http://www.codeproject.com/Tips/175592/Code-Coverage-And-Generics

为该行生成的 IL 等效于:

T nuevoObjeto = (default(T) == null) ? Activator.CreateInstance<T>() : default(T);

这允许将结构用于通用类型,因为它们满足 new 约束。

因此,如果您想要 100% 的代码覆盖率,请使用结构测试泛型方法或更改约束以要求泛型类型为 class 使用 where T : class