XmlDocument的SelectNodes方法是否可能返回null?

9

SelectNodes()XmlDocument 上被调用时能否返回 null?

我的问题是我正在努力达到100%的单元测试代码覆盖率;ReSharper告诉我需要防范 SelectNodes() 方法返回 null,但我无法想象 XmlDocument 如何会返回 null(因此,也就无法测试我的防范措施并达到100%的单元测试覆盖率!)

3个回答

10

查看Reflector,XmlDocument基类XmlNode上的SelectNodes()方法在尝试创建导航器时可能返回null。CreateNavigator()相当复杂,确实会在某些情况下返回null。这些情况似乎与格式不正确的XML文档有关 - 因此这是SelectNodes()失败的测试用例。


1
一个格式不正确的文档不会完全解析失败吗?我在CreateNavigator中看到的内容似乎只处理有效的标记。 - rpetrich
2
我认为CreateNavigator()返回null,但仅适用于某些类型的XmlNode(不包括XmlDocument)。因此,据我所见,如果您已加载了XmlDocument并且在解析时没有抛出异常,则CreateNavigator()永远不会返回null,因此SelectNodes()也永远不会返回null - Daniel Fortunov

4
如果你在XmlDocument本身上调用SelectNodes,并且确实是XmlDocument而不是派生类,那么SelectNodes将不会返回null。
如果你创建了一个派生类并覆盖了CreateNavigator(XmlNode)方法,那么SelectNodes可能会返回null。
同样地,如果你在EntityReference、DocumentType或者XmlDeclaration节点上调用SelectNodes,你也会得到null。
简而言之,对于XmlDocument或XmlNode的100%涵盖,你必须测试是否为null。

2
这就是问题所在:我确实刚刚创建了它,因此我知道SelectNodes()永远不会返回null。虽然从技术上讲,如果以后的重构导致文档被外部传递,它可能会返回null。唯一的问题是现在我没有办法在单元测试中测试==null的情况了。 - Daniel Fortunov
我知道我晚了10年,但是这个问题有解决方案吗? - Vin Shahrdar

2

是否有必要达到100%的代码覆盖率?在正常(即可控、可测试)情况下,这甚至可能不可能实现吗?

我们经常发现使用“语法糖”构造,如 using {} 块,会创建“隐藏”的代码路径(最可能是 finally {}catch {} 块),除非某些环境条件(如损坏的套接字或损坏的磁盘)妨碍了它们的运行,否则无法执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接