2010-05-07 11 views
3

De MBUnit Je suis en train de vérifier si les valeurs de deux objets sont les mêmes en utilisantLa comparaison de deux objets qui sont les mêmes dans MbUnit

Assert.AreSame(RawDataRow, result); 

Cependant, je reçois les éléments suivants échouent:

Expected Value & Actual Value : {RawDataRow: CentreID = "CentreID1", 
CentreLearnerRef = "CentreLearnerRef1", 
ContactID = 1, DOB = 2010-05-05T00:00:00.0000000, 
Email = "Email1", ErrorCodes = "ErrorCodes1", 
ErrorDescription = "ErrorDescription1", FirstName = "FirstName1"} 

Remarque: Les deux valeurs ont le même aspect lorsqu'elles sont formatées, mais ce sont des instances distinctes.

Je ne veux pas avoir à passer par chaque propriété. Puis-je le faire à partir de MbUnit?

Répondre

0

J'ai fini par construire mes propres réflexions à l'aide

private bool PropertiesEqual<T>(T object1, T object2) 
     { 
      PropertyDescriptorCollection object2Properties = TypeDescriptor.GetProperties(object1); 
      foreach (PropertyDescriptor object1Property in TypeDescriptor.GetProperties(object2)) 
      { 
       PropertyDescriptor object2Property = object2Properties.Find(object1Property.Name, true); 

       if (object2Property != null) 
       { 
        object object1Value = object1Property.GetValue(object1); 
        object object2Value = object2Property.GetValue(object2); 

        if ((object1Value == null && object2Value != null) || (object1Value != null && object2Value == null)) 
        { 
         return false; 
        } 

        if (object1Value != null && object2Value != null) 
        { 
         if (!object1Value.Equals(object2Value)) 
         { 
          return false; 
         } 
        } 
       } 
      } 
      return true; 
     } 
+0

Cela fonctionnera bien.Mais MbUnit a déjà un comparateur d'égalité structurel intégré (voir ma réponse). –

0

Cherchez-vous spécifiquement l'égalité référentielle ? AreSame teste que les deux références pointent vers le même objet. De l'Doco:

Assert.AreSame - Vérifie que la valeur réelle est identique à référentiellement une valeur attendue.

Si vous cherchez simplement à comparer que deux instances d'un objet sont logiquement égales, alors vous avez besoin de AreEqual.

Assert.AreEqual - Vérifie qu'une valeur réelle est égale à une certaine valeur attendue.

+0

C'est ce que je pensais, mais je reçois le même résultat pour cela aussi – Coppermill

+0

Juste pour référence: En utilisant Assert.AreEqual ou Assert.AreSame retourne « Remarque: Les deux valeurs ont le même aspect quand ils sont en forme, mais des cas distincts. " – Coppermill

2

Fondamentalement, Assert.AreEqual utilise Object.Equals() pour vérifier l'égalité entre la valeur réelle et l'instance attendue, alors que Assert.AreSame utilise Object.ReferenceEquals.

Si votre classe n'implémente aucun mécanisme d'égalité intégré; par exemple en surchargeant Object.Equals, vous finirez avec le problème que vous décrivez car MbUnit ne sait pas comment comparer deux instances du type testé.

Il existe plusieurs solutions. L'un d'entre eux est la solution de Coppermill: vous pouvez implémenter un comparateur d'égalité structurelle basé sur la réflexion. Mais MbUnit a déjà intégré feature like that. Ça s'appelle StructuralEqualityComparer<T> et c'est très facile à utiliser. Alors, pourquoi réinventer la roue?

Assert.AreSame(RawDataRow, result, new StructuralEqualityComparer<MyDataRow> 
{ 
    { x => x.CentreID }, 
    { x => x.CentreLearnerRef, (a, b) => a.Equals(b, StringComparison.OrdinalIgnoreCase) }, 
    { x => x.ContactID }, 
    // You can customize completely the comparison process... 
}); 

Quoi qu'il en soit, je vous suggère de lire cet article: http://interfacingreality.blogspot.com/2009/09/equality-assertions-in-mbunit-v3.html

Vous pouvez également lire that article dans le wiki Gallio.

+1

J'adore cette fonctionnalité. :) –

0

En MbUnit 3, vous pouvez utiliser StructuralEqualityComparer:

Assert.AreElementsEqual (obj1, obj2, nouveau StructuralEqualityComparer());