2012-06-21 16 views
5

Utilizzo il framework XUnit per testare il codice C#.XUnit Asserzione per il controllo di uguaglianza degli oggetti

Esiste in questo framework un metodo di asserzione che confronti l'oggetto? La mia intenzione è quella di verificare l'uguaglianza di ciascuna delle variabili membro pubbliche e private dell'oggetto.

ho cercato quelle alternative, ma raramente funziona:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

C'è "confronto approfondito" in xUnit. Dovrai implementare IEquatable per i tuoi oggetti, quindi Assert.Equals funzionerà. – seldary

+1

'Assert.Same()' confronta per riferimento; asserisce che 'Obj1' e' Obj2' sono lo stesso ** oggetto ** piuttosto che solo ** guardando ** lo stesso. – TeaDrivenDev

risposta

6

È necessario disporre di un operatore di confronto personalizzato per raggiungere questo obiettivo, quando si confrontano gli oggetti altrimenti vengono controllati sulla base del fatto che si riferiscono allo stesso oggetto in memoria. Per ignorare questo comportamento è necessario eseguire l'override del metodo Equals e GetHashCode e poi si potrebbe fare:

Assert.True(obj1.Equals(obj2)); 

Ecco una pagina circa sovraccarico MSDN Equals metodo: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

anche apt il commento sulla questione: What's the difference between IEquatable and just overriding Object.Equals()?

+1

Capisco che con l'implementazione del metodo "Equals" personalizzato, questo controllo può essere eseguito. Ma esiste un metodo per fare un confronto tra byte ciechi, che renderà più facile il controllo? Questo perché finirò per avere un'implementazione "Equals" in "Software in prova" solo per l'unità di prova. – inquisitive

+1

Ho provato a utilizzare i metodi di serializzazione per convertire entrambi gli oggetti in un array di byte e ha funzionato. Ma viene fornito con un vincolo di aggiungere attributo [serializzabile] alla mia classe che ha variabili membro private. Immagino che questo non sia buono in prospettiva di progettazione – inquisitive

8

ho avuto problema simile, ma poi per fortuna sto già usando

using Newtonsoft.Json; 

Quindi ho dovuto serializzarlo su json object quindi confrontarlo come stringa.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Lo considero più utile dell'implementazione di un metodo Equals perché mi piacerebbe che il mio assert non riuscisse a dirmi qualcosa su cosa c'era di sbagliato. Quello che mi piacerebbe idealmente è avere qualcosa che possa attraversare un albero degli oggetti e accumulare informazioni su quali proprietà/sottostrutture non sono uguali e fallire con quelle informazioni. –

+0

@RikkiGibson non sta implementando Equals solo nel modo giusto per farlo? Basta aggiungere eccezioni a un elenco negli uguali per ogni proprietà diversa, quindi alla fine o restituire true o generare tutte le eccezioni –

+0

Sì, ma può essere scrupoloso fare caso per caso, motivo per cui ho teso a cercare soluzioni basate sulla riflessione in passato quando si confrontano alberi di semplici vecchi oggetti, primitive e collezioni. –