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

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

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, поэтому я знаю, что он правильно выполняет проекцию, но код по-прежнему считается незакрытым.

Есть ли у кого-нибудь понимание того, почему кажется, что только выбранная часть запроса считается не охваченной покрытием кода?


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


Ответы (1)


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

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

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

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

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

person Peter Ritchie    schedule 11.09.2012