XmlDocument上的SelectNodes是否可能返回null?
时间:2020-03-05 18:51:47 来源:igfitidea点击:
XmlDocument上调用的SelectNodes()是否可能返回null?
我的困境是我试图达到100%的单元测试代码覆盖率; ReSharper告诉我,我需要防止SelectNodes()方法返回空值,但是我看不到XmlDocument可以返回空值的方法(因此,无法测试我的Guard子句并达到100%单元测试覆盖!)
解决方案
回答
是否有必要达到100%的代码覆盖率?确实,在正常(即可控制,可测试)的情况下甚至有可能吗?
我们经常发现使用"语法糖"结构(如" using {}"块)会创建"隐藏"的代码路径(最有可能是" finally {}"或者" catch {}"块),除非某些环境条件(例如损坏的插槽或者损坏的磁盘)妨碍了操作。
回答
查看Reflector,如果XmlDocument的基类XmlNode上的SelectNodes()方法尝试创建导航器,则返回null。 CreateNavigator()非常复杂,在某些情况下确实会返回null。这些情况似乎是在格式错误的XML文档周围,因此存在SelectNodes()失败的测试用例。
回答
如果我们是在XmlDocument本身上调用SelectNodes,而它实际上是XmlDocument而不是派生类,则SelectNodes不会返回null。
如果创建后代类并覆盖CreateNavigator(XmlNode)方法,则SelectNodes可能返回null。
同样,如果我们在EntityReference,DocumentType或者XmlDeclaration节点上调用SelectNodes,则也会得到null
简而言之,对于我们不只是创建的XmlDocument或者XmlNode的100%覆盖率,我们必须测试null。