Lambda表达式的代码覆盖率

时间:2010-09-13 14:32:49

标签: c# unit-testing lambda 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();
}

有点奇怪。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

foreach (var x in this.LanguageListItems)
{
    var local = x;
}

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

答案 1 :(得分:0)

进行单元测试时,如果有一种方法可以返回描述为LanguageListItems的列表,则可以在单元测试中执行此操作:

var result = await controller.SomeAction();
var okObjectResult = Assert.IsType<OkObjectResult>(result);
var results = Assert.IsAssignableFrom<IEnumerable<YourDtoClass>>okObjectResult.Value);
Assert.NotNull(results);
Assert.All(results, dto => Assert.NotNull(dto.PendingItemCount));
Assert.All(results, dto => Assert.NotNull(dto.ApprovedItemCount));

每个dto属性的每个断言将执行lambda表达式,然后将其显示为被覆盖。