La comparaison de deux objets qui sont les mêmes dans MbUnit
-
04-10-2019 - |
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?
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 ());