Покрытие кода для лямбда-выражений - PullRequest
7 голосов
/ 13 сентября 2010

Я вижу шаблон во всем коде, где лямбда-выражение отображается как не покрытое покрытием кода, отладчик выполняет код, и нет никаких условных блоков.

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 ]

5 голосов
/ 13 сентября 2010

Я думаю, вы имеете в виду, что отладчик не перешагивает указанную строку; это правильно?

Если это ваш вопрос, то ответ таков: по крайней мере, в данном конкретном случае вы видите отложенное выполнение . Все методы расширения LINQ, предоставляемые System.Linq.Enumerable, демонстрируют это поведение, а именно: код внутри самого оператора lambda не выполняется в строке, где вы его определяете. Код выполняется только после перечисления результирующего объекта.

Добавьте это под кодом, который вы отправили:

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

Здесь вы увидите, как отладчик возвращается к вашей лямбде.

0 голосов
/ 22 мая 2019

Когда вы делаете модульные тесты, если у вас есть метод, который возвращает список, который вы описали как 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));

Каждый Assert любого из dto-овсвойство будет выполнять лямбда-выражение, а затем оно будет выглядеть как покрытое.

...