Lambda表达式的代码覆盖率

Rod*_*son 7 c# lambda unit-testing code-coverage

我在整个代码中看到一个模式,其中lambda表达式显示为未覆盖代码覆盖率,调试器会逐步执行代码并且没有条件块.

public CollectionModel()
{
    List<Language> languages = LanguageService.GetLanguages();
    this.LanguageListItems =
        languages.Select(
            s =>
            new SelectListItem { Text = s.Name, Value = s.LanguageCode, Selected = false }). // <-- this shows as not covered
            AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)

这有点奇怪.有任何想法吗?

Dan*_*Tao 5

我认为你的意思是调试器没有跨越指示的行; 是对的吗?

如果这是你的问题,那么答案是,至少在这种特殊情况下,你所看到的是延迟执行.所提供的所有LINQ扩展方法都System.Linq.Enumerable表现出这种行为:即,lambda语句本身内的代码不会在您定义它的行上执行.只有在枚举结果对象后才会执行代码.

在您发布的代码下面添加:

foreach (var x in this.LanguageListItems)
{
    var local = x;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您将看到调试器跳回到您的lambda.

  • 另请注意,如果集合为空,则即使迭代集合,也不会调用投影. (2认同)