我不知道为什么我的代码覆盖率会出现这种行为,也许有人知道这一点。 您可能知道,代码覆盖率在达到时为蓝色,未到达时为红色,部分到达代码行时为黄色。
我编写了一个接收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; 如果你调试这段代码,那么调试就能很好地达到那条线,实际上测试是绿色的,带有预期的结果。
测试执行此步骤。
希望有人知道为什么会这样...... 谢谢!
答案 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
来测试它