2010-03-25 73 views
0

J'ai un code ci-dessous qui lance une exception dans les environnements d'intégration mais pas dans mes tests unitaires. Fondamentalement, je suis en train de trier certains éléments XML (linq-2-sql XElement) par une valeur d'attribut. Tous les nœuds ont l'attribut défini. L'exception levée est "Au moins un objet doit implémenter IComparable". Le code peut être fixé à travailler dans les deux cas avec:XAttribute implémentant IComparable lors des tests, mais pas quand live

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

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

Mais je me demande pourquoi ce lancer une exception lorsqu'il est lancé dans un environnement de débogage, mais pas de mes tests unitaires? J'ai peur que certains utilitaires utilisés par ma bibliothèque de tests aient des effets secondaires inattendus, mais je ne trouve rien. Que devrais-je rechercher? Notez que dans l'environnement de test, elements.First(). Attribute ("name") n'est pas null mais elements.First(). L'attribut ("name") comme IComparable est null, donc dans les deux cas, le XAttribute n'implémente pas IComparable.

Répondre

0

Peu importe l'environnement XAttribute n'implémente pas IComparable donc vous avez déjà trouvé la solution de contournement en utilisant .Value. Maintenant, si vous êtes curuous pourquoi cette exception se produit ici est un test: dans votre test unitaire vous avez un élément avec name attribut qui est vide:

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(); 
+0

Dans le cas où l'exception a été levée, je vérifiais que x .Attribute ("nom") n'a pas évalué à null. Le fait que l'ajout de x.Attribute ("name"). Value n'ait pas généré d'exception montre également que null n'était pas le problème. –