【问题标题】:Code Coverage on a LINQ projectionLINQ 投影上的代码覆盖率
【发布时间】:2012-09-11 19:06:19
【问题描述】:

我的应用程序中有以下几行代码,我不知道为什么,但代码覆盖率告诉我它没有被覆盖:

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% 覆盖。我的单元测试正在为 request.Filters 创建一个非空集合,所以我知道它正在正确地进行投影,但仍然认为代码没有被覆盖。

有没有人知道为什么感觉只有查询的选择部分被认为没有被代码覆盖?

【问题讨论】:

  • 损坏的代码覆盖率工具?您是在测试中评估了 IEnumerable(使用 ToList() 或类似方法)还是只是创建它?
  • 它是 Visual Studio 2010 终极版的默认代码覆盖工具。我想它可能在实施中存在缺陷。
  • 你试过 Visual Studio 2012 看看有什么不同吗?
  • 您是否考虑过使用其他工具,例如 NCover、OpenCover、PartCover?这些工具有一个 XML 输出,可以告诉您“代码点”在哪里以及它们在哪里检测。所有这些信息最终都来自 PDB 文件,因此它们只能与提供的内容一起使用。

标签: c# visual-studio code-coverage


【解决方案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;

调试器在单步执行这样的代码方面是出了名的糟糕,因此,编译器可能只是为探查器或调试器生成了足够的关于它的信息。

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-05-03
    • 2012-05-04
    • 2018-07-10
    相关资源
    最近更新 更多