Sto scrivendo alcuni test di unità e la seguente asserzione fallisce:Perché Assert.AreEqual() esegue il cast sull'oggetto prima di eseguire il confronto?
Assert.AreEqual(expected.Episode, actual.Episode);
Se io chiamo questo, invece, riesce:
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
ho dato per scontato che in ultima analisi, Assert.AreEqual()
chiama il metodo per la Equals()
digitare è dato, in questo caso Episode.Equals()
.
Tuttavia, sotto le coperte in Microsoft.VisualStudio.TestTools.UnitTesting.Assert ho trovato il seguente codice (decompilato da ReSharper):
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
Ciò implica per me che il metodo AreEqual()
è colata sia expected
e actual
a object
per forzare l'utilizzo del metodo base Equals()
anziché il sovraccarico che ho scritto nella classe Episode
. Il metodo base controllerà semplicemente per vedere se i riferimenti sono gli stessi, che non sono.
Ho due domande:
- è la mia spiegazione in realtà corretto, o mi sono perso qualcosa?
- Perché il framework desidera forzare l'uso di object.Equals() anziché un sovraccarico di tale metodo?
Se è rilevante, qui è il mio metodo:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}
Offtopic: quale versione di ReSharper può decompilare? – sll
Non sono sicuro di quanto tempo ci sia stato ma almeno v5 nella mia esperienza ... la prima volta che F12 (vai alla dichiarazione) su un oggetto interno ti chiederà cosa vuoi fare; una delle opzioni è decompilare. C'è anche un decompilatore standalone gratuito da Jetbrains. –
btw, il metodo mostrato è un * overload *, non un 'override'. –