正在正确生成人们推荐用于测试xml的单元测试策略.
我目前的测试看起来很原始,有点像:
[Test] public void pseudo_test() { XmlDocument myDOC = new XmlDocument(); mydoc = _task.MyMethodToMakeXMLDoc(); Assert.AreEqual(myDoc.OuterXML(),"big string of XML") }
Robert Rossn.. 21
首先,正如每个人都说的那样,如果为其定义了模式,则验证XML.(如果没有,请定义一个.)
但是,通过对文档执行XPath查询,您可以构建比这更细粒度的测试,例如:
string xml="Your xml string here" ; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); path = "/doc/element1[@id='key1']/element2[. = 'value2']"; Assert.IsTrue(doc.SelectSingleNode(path) != null);
这使您不仅可以测试文档是否在语义上有效,还可以测试生成它的方法是否使用您期望的值填充它.
首先,正如每个人都说的那样,如果为其定义了模式,则验证XML.(如果没有,请定义一个.)
但是,通过对文档执行XPath查询,您可以构建比这更细粒度的测试,例如:
string xml="Your xml string here" ; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); path = "/doc/element1[@id='key1']/element2[. = 'value2']"; Assert.IsTrue(doc.SelectSingleNode(path) != null);
这使您不仅可以测试文档是否在语义上有效,还可以测试生成它的方法是否使用您期望的值填充它.
XMLUnit可以帮助您.
Fluent Assertions是一个出色的库,用于以流畅,易读的方式表达测试断言.它适用于所有主要的单元测试框架.
它还有一些有用的XML功能(全部来自这里的示例),例如:
xElementA.Should().Be(xElementB); xDocument.Should().HaveRoot("configuration"); xDocument.Should().HaveElement("settings"); xElement.Should().HaveAttribute("age", "36"); xElement.Should().HaveElement("address"); xAttribute.Should().HaveValue("Amsterdam");
请注意,这适用于LINQ-To-XML而不是原始问题中指定的XmlDocument对象,但是现在我个人发现我使用LINQ-To-XML作为首选.
如果您想要添加更多XML断言以满足您的需求,它也非常容易扩展.
另一种可能是使用XmlReader并检查错误计数> 0.这样的事情:
void CheckXml() { string _xmlFile = "this.xml"; string _xsdFile = "schema.xsd"; StringCollection _xmlErrors = new StringCollection(); XmlReader reader = null; XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventHandler); settings.ValidationType = ValidationType.Schema; settings.IgnoreComments = chkIgnoreComments.Checked; settings.IgnoreProcessingInstructions = chkIgnoreProcessingInstructions.Checked; settings.IgnoreWhitespace = chkIgnoreWhiteSpace.Checked; settings.Schemas.Add(null, XmlReader.Create(_xsdFile)); reader = XmlReader.Create(_xmlFile, settings); while (reader.Read()) { } reader.Close(); Assert.AreEqual(_xmlErrors.Count,0); } void ValidationEventHandler(object sender, ValidationEventArgs args) { _xmlErrors.Add("<" + args.Severity + "> " + args.Message); }