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?

È stato utile?

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 ());

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top