2012-06-21 15 views
5

Estoy usando XUnit framework para probar mi código C#.XUnit Afirmación para verificar la igualdad de objetos

¿Hay algún método de afirmación disponible en este marco que haga la comparación de objetos? Mi intención es verificar la igualdad de cada una de las variables de miembro público y privado del objeto.

me trataron esas alternativas, pero rara vez funciona:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

Hay una "comparación profunda" en xUnit. Tendrá que implementar IEtabletable para sus objetos, y luego Assert.Equals funcionará. – seldary

+1

'Assert.Same()' se compara por referencia; afirma que 'Obj1' y' Obj2' son el ** mismo ** objeto en lugar de simplemente ** buscar ** lo mismo. – TeaDrivenDev

Respuesta

6

Es necesario tener un comparador personalizado para lograr esto, cuando se comparan los objetos de lo contrario, se comprueban sobre la base de si se están refiriendo a la misma objeto en la memoria. Para anular este comportamiento se debe redefinir el método Equals y GetHashCode y entonces se podría hacer:

Assert.True(obj1.Equals(obj2)); 

Aquí se presenta una sobrecarga página ABT MSDN es igual método: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

también apto el comentario sobre la pregunta: What's the difference between IEquatable and just overriding Object.Equals()?

+1

Entiendo que al implementar el método "Igual" personalizado, se puede realizar esta comprobación. Pero, ¿hay algún método para hacer una comparación de byte ciego, que facilitará el control? Esto se debe a que terminaré teniendo una implementación "Igual" en "Software bajo prueba" solo para el examen de unidades. – inquisitive

+1

Intenté usar métodos de serialización para convertir ambos objetos en una matriz de bytes y funcionó. Pero viene con una restricción de agregar un atributo [serializable] a mi clase que tiene variables miembro privadas. Supongo que esto no es bueno desde el punto de vista del diseño. – inquisitive

8

tuve problema similar, pero afortunadamente ya estoy usando

using Newtonsoft.Json; 

Así que solo tuve que serializarlo en el objeto json y compararlo como una cadena.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Lo considero más útil que implementar un método Equals porque me gustaría que mi afirmación no me diga algo sobre lo que estaba mal. Lo que me gustaría idealmente es tener algo que pueda atravesar un árbol de objetos y acumular información sobre qué propiedades/subárboles no son iguales y si fallan con esa información. –

+0

@RikkiGibson no está implementando Equals simplemente de la manera correcta para hacerlo? Simplemente agregue excepciones a una lista en los equivalentes para cada propiedad que sea diferente, luego al final, devuelva la verdad o arroje todas las excepciones –

+0

Sí, pero puede ser complicado hacerlo caso por caso, por lo que tendí a busque soluciones basadas en la reflexión en el pasado al comparar árboles de objetos antiguos simples, primitivas y colecciones. –

Cuestiones relacionadas