代码覆盖率不标记使用<t>传递</t>的行

时间:2015-01-09 00:10:57

标签: reflection nsubstitute unit-testing

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

我编写了一个接收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那样的条件......只是一个简单的新的T&#34; 如果你调试这段代码,那么调试就能很好地达到那条线,实际上测试是绿色的,带有预期的结果。

测试执行此步骤。

  1. 假IDataReader(使用nSubstitute)
  2. datareader上只有1个结果。
  3. T仅使用一个TestClass进行测试......如USERTEST。
  4. 希望有人知道为什么会这样...... 谢谢!

2 个答案:

答案 0 :(得分:2)

为该行生成的IL等同于:

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

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

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

答案 1 :(得分:0)

尝试使用struct或将类约束添加到泛型方法 - http://www.codeproject.com/Tips/175592/Code-Coverage-And-Generics

来测试它