代码覆盖不会将使用 <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"
如果你调试这段代码,调试会很好地到达那一行,事实上测试是绿色的,有预期的结果。
测试执行此步骤。
- 伪造的 IDataReader(带有 nSubstitute)
- 数据读取器上只有 1 个结果。
- 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
我不知道为什么我的代码覆盖率会出现这种行为,也许有人知道原因。 如您所知,代码覆盖率达到时为蓝色,未达到时为红色,部分达到代码行时为黄色。
我编写了一个小映射器,它接收 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" 如果你调试这段代码,调试会很好地到达那一行,事实上测试是绿色的,有预期的结果。
测试执行此步骤。
- 伪造的 IDataReader(带有 nSubstitute)
- 数据读取器上只有 1 个结果。
- 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