Confronto di due oggetti che sono gli stessi in MbUnit
-
04-10-2019 - |
Domanda
Da MBUnit Sto cercando di verificare se i valori di due oggetti sono gli stessi usando
Assert.AreSame(RawDataRow, result);
Comunque sto ottenendo il seguente fallire:
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"}
Nota: Entrambi i valori hanno lo stesso aspetto quando formattate ma sono casi distinti
.Non voglio avere a passare attraverso ogni proprietà. Posso farlo da MbUnit?
Soluzione 3
Ho finito per costruire il mio utilizzando Riflessioni
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;
}
Altri suggerimenti
In sostanza, gli usi Assert.AreEqual
Object.Equals()
per verificare l'uguaglianza tra il reale e l'istanza previsto, mentre Assert.AreSame
utilizza Object.ReferenceEquals
.
Se la classe non implementa alcun meccanismo incorporato uguaglianza; per esempio sovrascrivendo Object.Equals
, si finirà con il problema che si descrive perché MbUnit non sa come confrontare due istanze del tipo in esame.
Ci sono diverse soluzioni. Uno di loro è la soluzione di Coppermill: si consiglia di implementare un confronto di uguaglianza strutturale sulla base di riflessione. Ma MbUnit ha già un integrato- caratteristica del genere . Si chiama StructuralEqualityComparer<T>
ed è molto facile da usare. Allora perché reinventare la ruota?
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...
});
In ogni caso, vi consiglio di leggere questo articolo: http://interfacingreality.blogspot.com/2009/09/equality-assertions-in-mbunit-v3.html
Si può anche voler leggere tale articolo in Gallio wiki.
Stai specificamente alla ricerca di uguaglianza referenziale ? AreSame
sta testando che entrambi i riferimenti puntano allo stesso oggetto. Dal doco:
Assert.AreSame
- verifica che un valore effettivo è identico a referenzialmente qualcuno si aspettava valore.
Se siete semplicemente alla ricerca per confrontare che due istanze di un oggetto sono logicamente uguali, allora AreEqual
è quello che ti serve.
Assert.AreEqual
- verifica che un valore effettivo è uguale a un certo valore atteso.
In MbUnit 3 è possibile utilizzare StructuralEqualityComparer:
Assert.AreElementsEqual (obj1, obj2, nuova StructuralEqualityComparer ());