Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Покрытие кода в проекции LINQ

Автор вопроса: DismissileОтветов: 1

У меня есть следующие строки кода в моем приложении, и я не уверен, почему, но покрытие кода говорит мне, что оно не покрыто:

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() или аналогичного) в тесте или просто создали его? Joachim Isaksson 11.09.2012
  • Это инструмент покрытия кода по умолчанию для Visual Studio 2010 Ultimate. Я полагаю, что это может быть ошибка в реализации. Dismissile 11.09.2012
  • Вы пробовали Visual Studio 2012, чтобы увидеть, отличается ли он? Peter Ritchie 12.09.2012
  • Рассматривали ли вы использование другого инструмента, такого как NCover, OpenCover, PartCover? Эти инструменты имеют XML-вывод, который сообщает вам, где находятся кодовые точки и где они используются. Вся эта информация, в конце концов, поступает из файлов PDB, поэтому они могут работать только с тем, с чем они поставляются. Shaun Wilde 12.09.2012

visual-studiocode-coverage

Ответы

Ответ 1 · рейтинг 1 · Peter Ritchie

Многое из того, что профайлер может сказать вам о том, что выполняется, а что нет, основано на том, что компилятор сообщает ему в отладочной информации.

select new FilterDTO
{
    FilterName = f.Name,
    Value = v.Value
}

..это лямбда, и компилятор переводит это в метод сгенерированного класса. Кроме того, синтаксис инициализатора преобразуется во что-то вроде

var x = new FilterDTO();
x.FilterName=f.Name;
x.Value = v.Value;
return x;

Отладчик, как известно, плохо справляется с пошаговым выполнением такого кода, поэтому может случиться так, что компилятор просто генерирует достаточно информации об этом для профилировщика или отладчика.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы