XAttribute реализует IComparable во время тестов, но не во время работы - PullRequest
0 голосов
/ 26 марта 2010

У меня есть код ниже, который вызывает исключение в интеграционных средах, но не в моих модульных тестах. По сути, я сортирую некоторые элементы XML (linq-2-sql XElement) по значению атрибута. Все узлы имеют определенный атрибут.

IEnumerable<XElement> elements = ...; // elementes are of the form<recipe name="something">

elements.OrderBy(e => e.Attribute("name"))

Исключением является "По крайней мере, один объект должен реализовывать IComparable". Код может быть исправлен для работы в любом случае с:

IEnumerable<XElement> elements = ...; // elementes are of the form<recipe name="something">

elements.OrderBy(e => e.Attribute("name").Value)

Но мне интересно, почему это вызывает исключение при запуске в среде отладки, а не из моих модульных тестов? Боюсь, что некоторые утилиты, которые использует моя тестовая библиотека, имеют неожиданные побочные эффекты, но я ничего не могу найти. Что я должен искать?

Обратите внимание, что в тестовой среде elements.First (). Attribute ("name") не является нулевым, а elements.First (). Attribute ("name") как IComparable имеет значение null, поэтому в обоих случаях XAttribute не реализовать IComparable.

1 Ответ

0 голосов
/ 26 марта 2010

Независимо от среды XAttribute не реализует IComparable , поэтому вы уже нашли обходной путь с помощью .Value. Теперь, если вы не знаете, почему возникает это исключение, вот тестовый пример: в вашем модульном тесте у вас есть элемент с атрибутом name, который пуст:

var elements = new[] { 
    new XElement("el1", new XAttribute("name", "foo")),
    new XElement("el1", new XAttribute("name", ""))
};

// This will throw the exception you are observing in your unit test
var orderedElements = elements.OrderBy(x => x.Attribute("name")).ToArray();
...