Dan*_*Dan 34 c# xml nunit unit-testing
正在正确生成人们推荐用于测试xml的单元测试策略.
我目前的测试看起来很原始,有点像:
[Test]
public void pseudo_test()
{
XmlDocument myDOC = new XmlDocument();
mydoc = _task.MyMethodToMakeXMLDoc();
Assert.AreEqual(myDoc.OuterXML(),"big string of XML")
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*ney 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);
Run Code Online (Sandbox Code Playgroud)
这使您不仅可以测试文档是否在语义上有效,还可以测试生成它的方法是否使用您期望的值填充它.
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");
Run Code Online (Sandbox Code Playgroud)
请注意,这适用于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);
}
Run Code Online (Sandbox Code Playgroud)
为什么不假设某些商业 xml 解析器是正确的并根据它验证您的 xml 代码呢?就像是。
Assert.IsTrue(myDoc.Xml.ParseOK)
Run Code Online (Sandbox Code Playgroud)
除此之外,如果您想要彻底,我想说您必须自己构建一个解析器并验证 xml 规范所需的每条规则。
归档时间: |
|
查看次数: |
19146 次 |
最近记录: |