LINQ投影的代码覆盖率

4

我的应用程序中有以下代码行,但我不确定为什么Code Coverage告诉我它没有被覆盖:

var filters = from f in request.Filters
              select new FilterDTO
              {
                   FilterName = f.name,
                   Value = f.value
              };

var filteredItems = repo.GetFilteredItems(filters);

它认为以下行未被覆盖:
select new FilterDTO
{
    FilterName = f.name,
    Value = f.value
};

其余部分都已经100%覆盖了。我的单元测试为请求中的Filters创建了一个非空集合,因此我知道它正在正确执行投影,但是代码仍然被认为不是覆盖的。

有人能解释一下为什么感觉只有查询的选择部分未被代码覆盖吗?


代码覆盖率工具出了问题?你在测试中评估了IEnumerable(使用ToList()或类似方法)还是只是创建了它? - Joachim Isaksson
这是Visual Studio 2010旗舰版的默认代码覆盖工具。我想它的实现可能存在缺陷。 - Dismissile
你尝试过使用Visual Studio 2012吗?看看它是否有所不同? - Peter Ritchie
你是否考虑过使用其他工具,如NCover、OpenCover、PartCover?这些工具都有XML输出,可以告诉你代码点在哪里以及它们的仪器位置。所有这些信息最终都来自PDB文件,因此它们只能使用提供的信息。 - Shaun Wilde
1个回答

1

分析器可以告诉你关于哪些代码被执行和哪些没有被执行的信息,这主要基于编译器在调试信息中提供的内容。

select new FilterDTO
{
    FilterName = f.Name,
    Value = v.Value
}

..是一个lambda表达式,编译器将其转换为生成类上的方法。此外,初始化程序语法被转换为类似于

的内容。
var x = new FilterDTO();
x.FilterName=f.Name;
x.Value = v.Value;
return x;

调试器在像那样的代码步进方面非常糟糕,因此编译器可能只是为分析器或调试器生成了足够的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接