XAttribute, реализующий IComparable во время тестов, но не в реальном времени

У меня есть код ниже, который вызывает исключение в средах интеграции, но не в моих модульных тестах. В основном я сортирую некоторые элементы 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") не равно null, а elements.First().Attribute("name") as IComparable имеет значение null, поэтому в обоих случаях XAttribute не реализует IComparable .


person Frank Schwieterman    schedule 25.03.2010    source источник


Ответы (1)


Независимо от среды 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();
person Darin Dimitrov    schedule 25.03.2010
comment
В случае, когда было выдано исключение, я убедился, что x.Attribute(name) не имеет значение null. Тот факт, что добавление x.Attribute(name).Value не привело к возникновению исключения, также свидетельствует о том, что проблема не в нулевом значении. - person Frank Schwieterman; 26.03.2010