visual studio numeros comparar code archivos c# .net xml unit-testing comparison

c# - studio - ¿Cuál es la mejor manera de comparar archivos XML para la igualdad?



comparar numeros c# (6)

Estoy usando .NET 2.0, y un cambio de código reciente ha invalidado mi llamada anterior Assert.AreEqual (que comparó dos cadenas de XML). Solo un elemento del XML es realmente diferente en la nueva base de código, por lo que espero que una comparación de todos los demás elementos me brinde el resultado que deseo. La comparación debe hacerse programáticamente, ya que es parte de una prueba unitaria.

Al principio, estaba considerando usar un par de instancias de XmlDocument. Pero luego encontré esto: http://drowningintechnicaldebt.com/blogs/scottroycraft/archive/2007/05/06/comparing-xml-files.aspx

Parece que podría funcionar, pero estaba interesado en la retroalimentación de Stack Overflow en caso de que haya una manera mejor.

Me gustaría evitar agregar otra dependencia para esto si es posible.

Preguntas similares


Debido a que el contenido de un archivo XML puede tener un formato diferente y aún considerarse el mismo (desde un punto de vista DOM) cuando prueba la igualdad que necesita para determinar cuál es la medida de esa igualdad, por ejemplo, ¿se ignora el formato? ¿se ignoran los metadatos, etc.? es importante posicionamiento, muchos casos extremos.

En general, crearía una clase que defina sus reglas de igualdad y la use para sus comparaciones, y si su clase de comparación implementa las IEqualityComparer and/or IEqualityComparer<T> , su clase se puede usar en un conjunto de listas de marcos incorporados como prueba de igualdad también. Además, por supuesto, puede tener tantas como necesite para medir la igualdad de manera diferente según lo requieran sus requisitos.

es decir

IEnumerable<T>.Contains IEnumerable<T>.Equals The constructior of a Dictionary etc etc


Puede encontrar que es menos frágil analizar el XML en un XmlDocument y basar sus llamadas a Assert en XPath Query. Aquí hay algunos métodos de aserción de ayuda que uso con frecuencia. Cada uno toma un XPathNavigator, que puede obtener llamando a CreateNavigator () en el XmlDocument o en cualquier nodo recuperado del documento. Un ejemplo de uso sería:

XmlDocument doc = new XmlDocument( "Testdoc.xml" ); XPathNavigator nav = doc.CreateNavigator(); AssertNodeValue( nav, "/root/foo", "foo_val" ); AssertNodeCount( nav, "/root/bar", 6 ) private static void AssertNodeValue(XPathNavigator nav, string xpath, string expected_val) { XPathNavigator node = nav.SelectSingleNode(xpath, nav); Assert.IsNotNull(node, "Node ''{0}'' not found", xpath); Assert.AreEqual( expected_val, node.Value ); } private static void AssertNodeExists(XPathNavigator nav, string xpath) { XPathNavigator node = nav.SelectSingleNode(xpath, nav); Assert.IsNotNull(node, "Node ''{0}'' not found", xpath); } private static void AssertNodeDoesNotExist(XPathNavigator nav, string xpath) { XPathNavigator node = nav.SelectSingleNode(xpath, nav); Assert.IsNull(node, "Node ''{0}'' found when it should not exist", xpath); } private static void AssertNodeCount(XPathNavigator nav, string xpath, int count) { XPathNodeIterator nodes = nav.Select( xpath, nav ); Assert.That( nodes.Count, Is.EqualTo( count ) ); }



Terminé obteniendo el resultado que quería con el siguiente código:

private static void ValidateResult(string validationXml, XPathNodeIterator iterator, params string[] excludedElements) { while (iterator.MoveNext()) { if (!((IList<string>)excludedElements).Contains(iterator.Current.Name)) { Assert.IsTrue(validationXml.Contains(iterator.Current.Value), "{0} is not the right value for {1}.", iterator.Current.Value, iterator.Current.Name); } } }

Antes de llamar al método, creo un navegador en la instancia de XmlDocument de esta manera:

XPathNavigator nav = xdoc.CreateNavigator();

A continuación, creo una instancia de XPathExpression, así:

XPathExpression expression = XPathExpression.Compile("/blah/*");

Llamo al método después de crear un iterador con la expresión:

XPathNodeIterator iterator = nav.Select(expression);

Aún estoy averiguando cómo optimizarlo aún más, pero por el momento funciona.


Hacer una comparación simple de cadenas en una cadena xml no siempre funciona. Por qué ?

por ejemplo ambos:

<MyElement></MyElmennt> y <MyElment/> son iguales desde un punto de vista xml .

Hay algoritmos para convertir haciendo que un xml siempre se vea igual, se llaman algoritmos de canonicalización. .Net tiene soporte para canonicalización.


Escribí una pequeña biblioteca con afirmaciones para serialización, fuente .

Muestra:

[Test] public void Foo() { ... XmlAssert.Equal(expected, actual, XmlAssertOptions.IgnoreDeclaration | XmlAssertOptions.IgnoreNamespaces); }