2009-07-06 8 views
10

Assert.Equals() nunca llamaNUnit Assert.Equals ¿Qué me estoy perdiendo?

Equals() 
operator == 
operator != 

Me estoy perdiendo algo? Implementé IEquatable, pero aún así los métodos nunca se invocan mientras utilizo nunit.

if (objectA != objectB) Assert.Fail(); //doesnt fail 
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail 
Assert.AreEqual(objectA, objectB); //fail 

ACTUALIZACIÓN

yo, hubiera sido más claro.

public class Entity 
{ 
    public int ID { get; set; } 
} 

var objectA = new Entity() { ID = 1 }; 
var objectB = new Entity() { ID = 1 }; 

dos casos separados ambos con el mismo ID he implementado todos los métodos pertinentes para hacer este trabajo para ==,! = E iguales pero nunit AreSame y AreEqual sigue sin llamar a esos métodos.

+1

Tengo exactamente el mismo problema. Por ahora estoy usando Assert.IsTrue (objectA.Equals (objectB)); –

+0

Tengo el mismo problema y he determinado que funciona si los objetos que estoy comparando son * no * la misma referencia. es decir, crea 2 objetos con propiedades diferentes, aparte de las propiedades de comparación de igualdad, entonces Assert.Equals funciona ... Si se compara la misma referencia (que seguramente son iguales) ¡entonces falla! como no es igual (NUnit 2.5) – PandaWood

+0

Usted está buscando 'Assert.AreEqual (objA, objB);' – DanielV

Respuesta

4

Usted es definitivamente correcto. Estaba luchando con un similar problem el día de hoy, hasta que encontré su publicación y ahora estoy seguro de que NUnit IsEqualTo() no llama consistentemente a las anulaciones Iguales provistas.

Digo constantemente, porque a veces lo hace. De hecho, tengo dos clases. El segundo derivado del primero. Cuando llamo a Is.EqualTo() en las instancias de la primera, NUnit llama a las anulaciones Iguales, para las instancias de la segunda no.

Si bien eso es muy peculiar, no tengo tiempo para investigar más sobre lo que está pasando.

Las personas con problemas o soluciones similares definitivamente deberían publicar al respecto, ya que esto es algo muy molesto y realmente me hizo dudar de la validez de mis pruebas.

Mientras tanto, creé la siguiente clase Affirm, que llama a las anulaciones de igual a igual (lo compruebo). Utiliza NUnit para hacer una Assert de igualdad simple en lugar de Is.EqualTo() y de alguna forma remedia el hecho de que, de esta forma, NUnit no da representaciones de cadena de los objetos en caso de que falle la prueba.

así que aquí está:

using NUnit.Framework; 

public static class Affirm 
{ 
    public static Affirmer That(object actual) 
    { 
     return new Affirmer(actual); 
    } 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public class Affirmer 
{ 
    readonly object _actual; 

    public Affirmer(object actual) 
    { 
     _actual = actual; 
    } 

    public void IsEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nExpected: <{0}>\nBut was: <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.True, failureMessage); 
    } 

    public void IsNotEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was:   <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.False, failureMessage); 
    } 
} 

utilizar de esta manera:

Affirm.That(actualObject).IsEqualTo(expectedObject); 

y

Affirm.That(actualObject).IsNotEqualTo(expectedObject); 

Espero que esto ayude.

+0

Para completar: como se puede ver en su publicación original (http://stackoverflow.com/questions/1624848/does-nunits-is-equalto-not-work-reliably-for-classes-derived-from-generic -classe), su problema fue causado por un error en su anulación de object.Equals (object). (Creo que el problema de OP de este subproceso fue causado por un error similar.) –

+0

@FabianSchmied No creo que se deba al error en el método de igualdad porque dice que Nunit nunca llama a su método equals. He venido aquí con el mismo problema. No importará lo que cambie en el método Equals si no lo está llamando Nunit – PandaWood

+0

Tengo el mismo problema pero mi prueba funcionó antes de implementar Equals en la clase. Algo debe haber convencido a NUnit para * no * llamar a mi método Equals, ahora que tengo uno. No creo que esté preparado para investigar el código, ya que puedo hacer que funcione usando Assert.IsTrue (obj1.Equals (obj2)) – PandaWood

8

Utilice Assert.AreEqual(a, b) para los tipos de valor, Assert.AreSame(a, b) para los tipos de referencia. http://www.nunit.org/index.php?p=identityAsserts&r=2.2.7

+0

Esto todavía dice que no son iguales por alguna razón ... (no llamará a mis métodos iguales) :( Lo que estoy tratando de probar son 2 instancias de la misma clase con la misma ID que debería decir sí son iguales. – bleevo

+0

No estoy seguro, ciertamente podría hacer Assert.IsTrue (objectA == objectB) pero no estoy seguro de por qué Necesito. – Robert

+1

'Assert.AreSame (a, b)' en realidad está ejecutando 'ReferenceEquals (a, b)', y podría no ser lo que está buscando. Si desea afirmar la misma instancia de objeto, entonces use este método De lo contrario, mejor podría usar 'Assert.AreEqual (a, b)' en su lugar. – Xilconic

3

Algunos marcos permiten que la igualdad funcione de manera diferente antes de que se asigne el Id (es decir, la entidad no guardada) que después, cuando está claro que la intención es que el Id de entidad sea la única base de calidad. ¿Estás utilizando algún tipo de marco o eres tu propia clase?

Si es su propia clase ¿puede mostrar la esencia de su lógica Equals()?

Cheers, Berryl

FYI Assert.AreSame nunca es una prueba para validar la implementación de IEquatable! Consulte ReferenceEquals en su documento de ayuda para comprender mejor esa afirmación.

+0

+1 para "Assert.AreSame NUNCA es una prueba para validar su implementación de IEquatable" –

1

Debería funcionar (vea este related question) si el método Equals fue anulado correctamente. ¿Podría ser un problema con su método Equals (aunque si simplemente consta de una comparación int, no lo creo)? Podría valer la pena establecer un punto de inflexión en su método Equals y luego ejecutar la prueba para ver qué sucede detrás de las escenas.

+0

Creo que establecer un punto de interrupción fue exactamente lo que hizo el OP ing – zcrar70

Cuestiones relacionadas