Question

De MBUnit Je suis en train de vérifier si les valeurs de deux objets sont les mêmes en utilisant

Assert.AreSame(RawDataRow, result);

Cependant, je reçois ce qui suit l'échec:

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 quand ils sont en forme, mais des cas distincts

.

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

Était-ce utile?

La solution 3

J'ai fini par construire mon propre à l'aide Réflexions

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;
        }

Autres conseils

En fait, l'utilisation des Assert.AreEqual Object.Equals() pour vérifier l'égalité entre le réel et l'instance attendue, alors que Assert.AreSame utilise Object.ReferenceEquals.

Si votre classe ne met pas en œuvre un mécanisme d'égalité intégré; par exemple en remplaçant Object.Equals, vous finirez par le problème que vous décrivez parce que MbUnit ne sait pas comment comparer deux instances du type sous test.

Il existe plusieurs solutions. L'un d'eux est la solution de Coppermill: vous pouvez mettre en place un comparateur d'égalité structurelle basée sur la réflexion. Mais MbUnit a déjà intégré fonctionnalité comme ça . Il est appelé StructuralEqualityComparer<T> et il 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 cet article dans le Gallio wiki.

Vous cherchez spécifiquement pour l'égalité de référence ? 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érentielle certains attendus valeur.

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

  

Assert.AreEqual - Vérifie que la valeur réelle est égale à une valeur attendue.

Dans MbUnit 3, vous pouvez utiliser StructuralEqualityComparer:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top