簡體   English   中英

Lambda表達式的代碼覆蓋率

[英]Code Coverage on Lambda Expressions

我在整個代碼中看到一個模式,其中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();
}

這有點奇怪。 有任何想法嗎?

我認為你的意思是調試器沒有跨越指示的行; 那正確嗎?

如果這是你的問題,那么答案是,至少在這種特殊情況下,你所看到的是延遲執行 System.Linq.Enumerable提供的所有LINQ擴展方法都表現出這種行為:即,lambda語句本身內的代碼不會在您定義它的行上執行。 只有在枚舉結果對象后才會執行代碼。

在您發布的代碼下面添加:

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

在這里,您將看到調試器跳回到您的lambda。

在進行單元測試時,如果您有一個方法返回您描述為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屬性的每個Assert都將執行lambda表達式,然后它將顯示為覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM