2008-09-11 15 views
7

Est-il possible que SelectNodes() appelé sur un XmlDocument renvoie null?Est-il possible que SelectNodes sur un XmlDocument renvoie null?

Mon problème est que j'essaie d'atteindre 100% de couverture de code de test unitaire; ReSharper me dit que je dois me prémunir contre un retour nul de la méthode SelectNodes(), mais je ne vois pas comment un XmlDocument peut retourner null (et donc pas moyen de tester ma clause guard et d'atteindre 100% de couverture test!

Répondre

2

Est-il nécessaire d'atteindre une couverture de code de 100%? En effet, est-ce même possible dans des circonstances normales (c'est-à-dire contrôlables, vérifiables)?

Nous constatons souvent que l'utilisation de constructions « de sucre syntaxique » comme le bloc using {}, il y a des chemins de code « cachées » créés (le plus probable finally {} ou catch {} blocs) qui ne peuvent être exercés que si une condition de l'environnement (comme une prise cassée ou disque cassé) entrave le chemin.

10

En regardant Reflector, la méthode SelectNodes() de la classe de base de XmlDocument, XmlNode, peut renvoyer une valeur nulle si sa tentative de création d'un navigateur retourne null. CreateNavigator() est assez complexe et retournera null dans quelques circonstances. Ces circonstances semblent être autour d'un document XML malformé - donc il y a votre cas de test pour l'échec de SelectNodes().

+0

Un document malformé ne pourra-t-il pas être entièrement analysé? Ce que j'ai vu à l'intérieur de CreateNavigator semblait ne traiter que du balisage valide – rpetrich

+2

Je pense que CreateNavigator() renvoie 'null' mais seulement pour certains types de XmlNode (non compris XmlDocument). Donc, autant que je peux voir, si vous avez chargé un XmlDocument et qu'il n'a pas été lancé lors de l'analyse, alors CreateNavigator() ne retournera jamais null et par conséquent SelectNodes() ne retournera jamais null. –

3

Si vous appelez SelectNodes sur XmlDocument lui-même et qu'il s'agit réellement d'un XmlDocument et non d'une classe dérivée que SelectNodes ne renverra pas null.

Si vous créez une classe descendante et remplacez la méthode CreateNavigator (XmlNode), alors SelectNodes peut renvoyer null.

De même, si vous appelez SelectNodes sur un EntityReference, DocumentType ou nœud XmlDeclaration, vous aurez nulle ainsi

En bref, pour une couverture de 100% sur un XmlDocument ou XmlNode vous ne venez de créer, vous avoir à tester pour null.

+2

Voilà le problème: * l'ai * simplement créé, donc je sais dans mon coeur que SelectNodes() ne peut jamais retourner null. Bien que techniquement, il pourrait * dire * si un refactoring ultérieur entraîne le passage du document en externe. Le seul problème est que maintenant je n'ai aucun moyen de tester le cas == null dans un test unitaire. –